Orientation in 2D of a point relative to multiple Η ΛΥΣΗ

Συζητήσεις σχετικές με την Delphi και την πρόγονη της Pascal

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
crmaris
Δημοσιεύσεις: 17
Εγγραφή: 20 Δεκ 2004 23:46

Orientation in 2D of a point relative to multiple Η ΛΥΣΗ

Δημοσίευση από crmaris » 07 Ιούλ 2007 12:59

πριν από λίγο καιρό είχα ποστάρει την παραπάνω απόρία.. Λοιπόν βρήκα την λυσή μετά από καμια βδομάδα που είχα ποστάρει και είπα να την βάλω εδώ τιμής ένεκεν :D

Για να βρούμε το orientation (πιο είναι πιο αριστερά, κέντρο, πιο δεξιά ) όλων των child nodes ενός node σε καρτεσιανό επίπεδο συντεταγμένων και έστω ότι γνωρίζουμε φυσικά τις συντεταγμένες (x,y) των nodes χρησιμοποιούμε τον παρακάτω κώδικα.

Καταρχήν η function orientation


function Tform1.Orientation(x,x1,x2: Integer): Integer;
var
Orin: Double;
node,node1,node2:Tnode;
begin
with Graphlist do
begin
node:=TNode(objects[x]);
node1:=TNode(objects[x1]);
node2:=TNode(objects[x2]);
(* Linear determinant of the 3 points *)
Orin := (node2.x - node1.x) * (node.y - node1.y) - (node.x - node1.x) * (node2.y - node1.y);

if Orin > 0.0 then Result := +1 (* Orientation is to the left-hand side *)
else if Orin < 0.0 then Result := -1 (* Orientaion is to the right-hand side *)
else
Result := 0; (* Orientation is neutral if result is 0 *)
end; // tis with
end;

και η function ColumnSortdescending

function ColumnSortDescending(List: TStringList; Index1, Index2: Integer): Integer;
var
int1,int2:integer;
begin
// get the strings to compare
int1 := strtoint(Copy(List[Index1],0,5));
int2 := strtoint(Copy(List[Index2],0,5));
if int1<int2 then result:=1
else if int1>int2 then result:=-1
else if int1=int2 then result:=0;
end; // function Column...



τις οποίες χρησιμοποιώ παρακάτω..
Έστω ότι το node έχει 4 child nodes και list η λίστα με τους αναγνωριστικούς αριθμούς των nodes (για παράδειγμα το node 1 (κεντρικό) έχει child τα nodes 2,3,4,5 )

v,j:integer; {μεταβλητές για τις for}
vert1,vert2:integer; {οι αναγνωριστικοι αριθμοί των nodes}
list,list1,list2:TstringList; {λίστες όπου αποθηκεύω τα nodes,orientation κτλ.}
orin:Integer {η sum τιμή του orientation για κάθε node}

if list.count=4 then // αν τα child nodes είναι τέσσερα
begin
for v:= 0 to List.Count - 1 do
begin
for j:=0 to List.Count - 1 do
begin
if v<>j then
begin
w:=list[v];
w1:=list[j];
vert1:=strtoint(copy(w,1,5));
vert2:=strtoint(copy(w1,1,5));
list1.add(format('%2d%4d%4d',[orientation(vert1,vert2,temp.index),vert1,vert2]));
end; // tis if
end; // tis for j=0
end; // tis for v=0
{ μέχρι εδώ βρήκα το orientation των node μεταξύ τους (πχ το 2 με το 3, το 2 με το 4, το 2 με το 5 κτλ). Η list1 θα έχει την μορφή

2 3 1(η τιμή του orientation)
2 4 1
2 5 1
Αυτό που πρέπει να κάνω τώρα είναι να προσθέσω όλα τα αποτελέσματα orientation τώρα για κάθε node και μετά να τα συγκρίνω μεταξύ τους. Το πιο αριστερό θα έχει την πιο θετική τιμή (πχ 3) και το πιο δεξιό την πιο αρνητική (πχ -3)}

v1:=0;
v2:=list1.Count div list.count; // για lisτ.count=4 το v2=3
repeat
orin:=0;
for v := v1 to v2-1 do // παίρνω ανά τρεις γραμμές την list και προσθέτω
begin
w:=list1[v];
v3:=strtoint(copy(w,1,2));
vert1:=strtoint(copy(w,3,4));
orin:=v3+orin;
end;
list2.add(format('%5d%4d',[orin,vert1]));
list2.customSort(@ColumnSortdescending);
{στην list2 βάζω τα child nodes με την τελική τιμή του orientation και μετά κάνω sort ξεκινώντας από την μεγαλύτερη τιμή προς την μικρότερη}
if list2.Count=4 then
begin
//showmessage(list2.gettext);
w:=list2[0];
w1:=list2[1];
w2:=list2[2];
w3:=list2[3];
temp.left_child:=strtoint(copy(w,6,4)); //το τέρμα αριστερό child
temp.left_child1:=strtoint(copy(w1,6,4)); // το αμέσως πιο αριστερό child
temp.right_child:=strtoint(copy(w2,6,4)); // το δεξί child
temp.right_child1:=strtoint(copy(w3,6,4)); // το τέρμα πιο δεξιό child
list2.clear;
end;

//to pio arnitiko einai deksia
//to pio thetiko einai aristera
inc(v1,list1.Count div list.count);
inc(v2,list1.Count div list.count);
until v2>list1.count ;
end; // tis if list.count =4

στο δικό μου πρόγραμμα μπορώ και βρίσκω το orientation για μέχρι 12 child nodes σε κάθε node..

και ένα παράδειγμα

Εδώ έχουμε την έξοδο της list2 {showmessage(list2.gettext). Βλέπουμε ότι η τιμή για το node 7 είναι 3 (τέρμα αριστερά) για το node 13 είναι 1(αμέσως πιο αριστερά) για το node 32 είναι -1 και για το node 8 είναι -3 (τέρμα δεξιά)..

Αυτά&#8230;
Συνημμένα
2.jpg

Απάντηση

Επιστροφή στο “Delphi, Pascal”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες