Rekenhulp gevraagd...
Moderator: Moderators
Re: Rekenhulp gevraagd...
Komt wel goed. Ooit waren dit soort dingen voor mij ook even duidelijk als een Chinese handleiding. Niks om je voor te schamen.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
Het gaat best aardig, maar ik moet het sneller (korter) zien te krijgen.... begint nu een beetje rot te lopen...
maar ik heb nu ook ff een hele rotte methode geschreven....
ik heb nu zo iets van over de rand van beide ovale teken ik punten (x,y) die zet ik in 2 arrays....
en dan ga ik die 2 arrays tov elkaar vergelijken, en kijken of ik ergens in beide arrays een put heb met de zelfde x,y coördinaten....
en dit werkt goed.... als ik maar veel punten op beide ovale kies... maar ja... dan word die geneste lussen ook steeds groter.... :-)
dus was nu aan het kijken om minderpunten te nemen, een naar lijnen te kijken.... en ik had dit gevonden om een intersect te vinden tussen 2 lijnen....
maar ben er nog niet helemaal uit wat I_X !=NULL is
is dat gewoon I_X <> 0 ?
en waarom staat er bij de vergelijking geen * voor? wat is dat sterretje?
maar ik heb nu ook ff een hele rotte methode geschreven....
ik heb nu zo iets van over de rand van beide ovale teken ik punten (x,y) die zet ik in 2 arrays....
en dan ga ik die 2 arrays tov elkaar vergelijken, en kijken of ik ergens in beide arrays een put heb met de zelfde x,y coördinaten....
en dit werkt goed.... als ik maar veel punten op beide ovale kies... maar ja... dan word die geneste lussen ook steeds groter.... :-)
dus was nu aan het kijken om minderpunten te nemen, een naar lijnen te kijken.... en ik had dit gevonden om een intersect te vinden tussen 2 lijnen....
Code: Selecteer alles
// Returns 1 if the lines intersect, otherwise 0. In addition, if the lines
// intersect the intersection point may be stored in the floats i_x and i_y.
char get_line_intersection(float p0_x, float p0_y, float p1_x, float p1_y,
float p2_x, float p2_y, float p3_x, float p3_y, float *i_x, float *i_y)
{
float s1_x, s1_y, s2_x, s2_y;
s1_x = p1_x - p0_x; s1_y = p1_y - p0_y;
s2_x = p3_x - p2_x; s2_y = p3_y - p2_y;
float s, t;
s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);
t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);
if (s >= 0 && s <= 1 && t >= 0 && t <= 1)
{
// Collision detected
if (i_x != NULL)
*i_x = p0_x + (t * s1_x);
if (i_y != NULL)
*i_y = p0_y + (t * s1_y);
return 1;
}
return 0; // No collision
}
maar ben er nog niet helemaal uit wat I_X !=NULL is
is dat gewoon I_X <> 0 ?
en waarom staat er bij de vergelijking geen * voor? wat is dat sterretje?
http://www.arjan-swets.com (met cnc filmpjes)
Re: Rekenhulp gevraagd...
Die * zijn pointers, het adres van een variabele in plaats van de variabele zelf.
Zoiets:
uint8_t *mijnadres = (uint8_t *)1000;
*mijnadres = 123;
Daarmee zet ik op adres 1000 in het geheugenbereik van het proces de waarde 123.
Maar je kunt dat rustig vergeten; die i_x en i_y worden gebruikt om het snijpunt van de twee lijnstukken door te geven. Dat is in jouw geval niet van belang, dus je kunt alles met i_x en i_y weglaten.
Zoiets:
uint8_t *mijnadres = (uint8_t *)1000;
*mijnadres = 123;
Daarmee zet ik op adres 1000 in het geheugenbereik van het proces de waarde 123.
Maar je kunt dat rustig vergeten; die i_x en i_y worden gebruikt om het snijpunt van de twee lijnstukken door te geven. Dat is in jouw geval niet van belang, dus je kunt alles met i_x en i_y weglaten.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
ik geloof niet dat dit verhaal helemaal werkt...
ik krijg steeds een error dat ik iets deel door 0... ?
edit: gevonden... typfoutje... toestand...
ik krijg steeds een error dat ik iets deel door 0... ?
edit: gevonden... typfoutje... toestand...
Laatst gewijzigd door Swets op 02 nov 2017 09:58, 1 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
Re: Rekenhulp gevraagd...
Met 2 volledig verticale of horizontale lijnstukken gebeurt dat inderdaad. Niet het meest handige stukje code dat je gejat hebt.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
ja zag het ook nu...DaBit schreef:Met 2 volledig verticale of horizontale lijnstukken gebeurt dat inderdaad. Niet het meest handige stukje code dat je gejat hebt.
tja... beter goed gejat... maar zelfs dat doe ik niet goed....
kijken of ik ergens iets kan vinden wat wel goed is....
http://www.arjan-swets.com (met cnc filmpjes)
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
Code: Selecteer alles
return (val > 0)? 1: 2;
http://www.arjan-swets.com (met cnc filmpjes)
- Breaker
- Donateur
- Berichten: 1965
- Lid geworden op: 26 mei 2015 22:43
- Locatie: Nabij Antwerpen
- Contacteer:
Re: Rekenhulp gevraagd...
Het vraagteken doet ongeveer hetzelfde als if/then/else. Anders geschreven:
Code: Selecteer alles
if (val > 0) then return 1 else return 2
Laatst gewijzigd door Breaker op 02 nov 2017 14:20, 1 keer totaal gewijzigd.
Geduld is een schone zaak, frezen niet...
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
Code: Selecteer alles
int orientation(Point p, Point q, Point r)
{
// See http://www.geeksforgeeks.org/orientation-3-ordered-points/
// for details of below formula.
int val = (q.y - p.y) * (r.x - q.x) -
(q.x - p.x) * (r.y - q.y);
if (val == 0) return 0; // colinear
return (val > 0)? 1: 2; // clock or counterclock wise
}
dus val is 0 geeft hij 0 terug..
groter als 0 geeft hij een 1 terug,
kleiner als 0 geeft hij een 2 terug..
Code: Selecteer alles
// Special Cases
// p1, q1 and p2 are colinear and p2 lies on segment p1q1
if (o1 == 0 && onSegment(p1, p2, q1)) return true;
Code: Selecteer alles
// Special Cases
// p1, q1 and p2 are colinear and p2 lies on segment p1q1
if o1 = 0 & onSegment(Point_P:=p1, Point_Q:=p2, Point_R:=q1)=1 then
Intersect :=1;
end_if;
http://www.arjan-swets.com (met cnc filmpjes)
- Breaker
- Donateur
- Berichten: 1965
- Lid geworden op: 26 mei 2015 22:43
- Locatie: Nabij Antwerpen
- Contacteer:
Re: Rekenhulp gevraagd...
Ik ken jouw taal niet precies... Kan je 'onSegment' eens laten zien?
Misschien nog extra haken om het geheel bij een dubbele vergelijking: if (x=a & y=b) then ...
Het is ook normaal om bij het aanroepen van een functie argumenten mee te geven, niet om andere functies uit te gaan voeren. Dus je geeft de waarden van al gedefinieerde variabelen mee:
En niet de variabelen in de functie definiëren:
Misschien nog extra haken om het geheel bij een dubbele vergelijking: if (x=a & y=b) then ...
Het is ook normaal om bij het aanroepen van een functie argumenten mee te geven, niet om andere functies uit te gaan voeren. Dus je geeft de waarden van al gedefinieerde variabelen mee:
Code: Selecteer alles
x=a
y=b
z=c
onSegment(x,y,z)
Code: Selecteer alles
onSegment(x=a, y=b, z=c)
Geduld is een schone zaak, frezen niet...
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
ik heb nu dit...
maar het werkt nog niet.... maar ben er nog niet uit waarom niet...
en ik ben dit verhaaltje aan het proberen: http://www.geeksforgeeks.org/check-if-t ... intersect/
maar het werkt nog niet.... maar ben er nog niet uit waarom niet...
en ik ben dit verhaaltje aan het proberen: http://www.geeksforgeeks.org/check-if-t ... intersect/
Code: Selecteer alles
FUNCTION StapelPatroon2D::DoIntersect
VAR_INPUT
X1 : DINT;
Y1 : DINT;
X2 : DINT;
Y2 : DINT;
X3 : DINT;
Y3 : DINT;
X4 : DINT;
Y4 : DINT;
END_VAR
VAR_OUTPUT
Intersect : DINT;
END_VAR
VAR
P1 : Points;
Q1 : Points;
P2 : Points;
Q2 : Points;
o1 : dint;
o2 : Dint;
o3 : Dint;
o4 : dint;
END_VAR
P1.x:=to_int(x1); P1.y:=to_int(y1);
Q1.x:=to_int(x2); Q1.y:=to_int(y2);
P2.x:=to_int(x3); P2.y:=to_int(y3);
Q2.x:=to_int(x4); Q2.y:=to_int(y4);
// The main function that returns true if line segment 'p1q1'
// and 'p2q2' intersect.
// Find the four orientations needed for general and
// special cases
o1 := orientation(p1, q1, p2);
o2 := orientation(p1, q1, q2);
o3 := orientation(p2, q2, p1);
o4 := orientation(p2, q2, q1);
Intersect := 0;
// General case
if o1 <> o2 & o3 <> o4 then
Intersect :=1;
end_if;
// Special Cases
// p1, q1 and p2 are colinear and p2 lies on segment p1q1
if o1 = 0 & onSegment(Point_P:=p1, Point_Q:=p2, Point_R:=q1)=1 then
Intersect :=1;
end_if;
// p1, q1 and p2 are colinear and q2 lies on segment p1q1
if o2 = 0 & onSegment(Point_P:=p1, Point_Q:=q2, Point_R:=q1)=1 then
Intersect :=1;
end_if;
// p2, q2 and p1 are colinear and p1 lies on segment p2q2
if o3 = 0 & onSegment(Point_P:=p2, Point_Q:=p1, Point_R:=q2)=1 then
Intersect :=1;
end_if;
// p2, q2 and q1 are colinear and q1 lies on segment p2q2
if o4 = 0 & onSegment(Point_P:=p2, Point_Q:=q1, Point_R:=q2)=1 then
Intersect :=1;
end_if;
END_FUNCTION
FUNCTION StapelPatroon2D::Orientation
VAR_INPUT
Point_p : Points;
Point_q : Points;
Point_r : Points;
END_VAR
VAR_OUTPUT
Orientation : DINT;
END_VAR
VAR
val : Dint;
END_VAR
// To find orientation of ordered triplet (p, q, r).
// The function returns following values
// 0 --> p, q and r are colinear
// 1 --> Clockwise
// 2 --> Counterclockwise
Val := (Point_q.y - Point_p.y) * (Point_r.x - Point_q.x) - (Point_q.x - Point_p.x) * (Point_r.y - Point_q.y);
if val= 0 then
Orientation := 0;
elsif val > 0 then
Orientation := 1;
else
Orientation := 2;
end_if;
END_FUNCTION
FUNCTION StapelPatroon2D::onSegment
VAR_INPUT
Point_P : Points;
Point_Q : Points;
Point_R : Points;
END_VAR
VAR_OUTPUT
onSegment : DINT;
END_VAR
VAR
temp1 : int;
temp2 : int;
temp3 : int;
temp4 : int;
END_VAR
temp1 :=Point_Q.x;
temp2 :=Point_Q.y;
temp3 := fnMax(Point_P.x, Point_R.x);
temp4 := fnMin(Point_P.x, Point_R.x);
// Given three colinear points p, q, r, the function checks if
// point q lies on line segment 'pr'
onSegment := 0;
if (Point_Q.x <= fnMax(Point_P.x, Point_R.x) & Point_Q.x >= fnMin(Point_P.x, Point_R.x) &
Point_Q.y <= fnMax(Point_P.y, Point_R.y) & Point_Q.y >= fnMin(Point_P.y, Point_R.y)) then
onSegment := 1;
end_if;
END_FUNCTION
FUNCTION StapelPatroon2D::fnMax
VAR_INPUT
Input1 : INT;
Input2 : INT;
END_VAR
VAR_OUTPUT
OutParam : INT;
END_VAR
if input1>=Input2 then
OutParam := Input1;
else
OutParam := Input2;
end_if;
END_FUNCTION
FUNCTION StapelPatroon2D::fnMin
VAR_INPUT
input1 : INT;
input2 : INT;
END_VAR
VAR_OUTPUT
OutParam : INT;
END_VAR
if input1<=Input2 then
OutParam := Input1;
else
OutParam := Input2;
end_if;
END_FUNCTION
http://www.arjan-swets.com (met cnc filmpjes)
- Breaker
- Donateur
- Berichten: 1965
- Lid geworden op: 26 mei 2015 22:43
- Locatie: Nabij Antwerpen
- Contacteer:
Re: Rekenhulp gevraagd...
'k heb niet alles doorgenomen maar wat opviel is het aanroepen van de functies:
- Voor Orientation lijkt het erop, behalve het missen van de hoofdletter in de aanroep
- Voor onSegment kan je het op dezelfde manier doen
- Dan vergelijken
- Voor Orientation lijkt het erop, behalve het missen van de hoofdletter in de aanroep
- Voor onSegment kan je het op dezelfde manier doen
- Dan vergelijken
Code: Selecteer alles
// Find the four orientations needed for general and
// special cases
o1 := Orientation(p1, q1, p2);
o2 := Orientation(p1, q1, q2);
o3 := Orientation(p2, q2, p1);
o4 := Orientation(p2, q2, q1);
os1 := onSegment(p1, p2, q1);
os2 := onSegment(p1, q2, q1);
os3 := onSegment(p2, p1, q2);
os4 := onSegment(p2, q1, q2);
Intersect := 0;
// General case
if (o1 <> o2 & o3 <> o4) then
Intersect :=1;
end_if;
// Special Cases
// p1, q1 and p2 are colinear and p2 lies on segment p1q1
if (o1 = 0 & os1 = 1) then
Intersect :=1;
end_if;
// p1, q1 and p2 are colinear and q2 lies on segment p1q1
if (o2 = 0 & os2 = 1) then
Intersect :=1;
end_if;
// p2, q2 and p1 are colinear and p1 lies on segment p2q2
if (o3 = 0 & os3 = 1) then
Intersect :=1;
end_if;
// p2, q2 and q1 are colinear and q1 lies on segment p2q2
if (o4 = 0 & os4 = 1) then
Intersect :=1;
end_if;
Geduld is een schone zaak, frezen niet...
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
ik ga nog eens kijken.... maar ik heb nu altijd een intersect... ook als de lijnen een meter uit elkaar staan... :-)
http://www.arjan-swets.com (met cnc filmpjes)
- Swets
- Berichten: 2662
- Lid geworden op: 09 feb 2007 21:49
- Locatie: krimpen aan den IJssel
- Contacteer:
Re: Rekenhulp gevraagd...
ik zie nu dat bij mij de x as van me assenstelsel gespiegeld is....
denk dat het daarom niet werkt? althans zou kunnen natuurlijk?
moet ik wel ff flink zoeken wat ik moet omkeren.... toestand...
nee...is toch goed... (ben nu op een stuk papier aan het kijken wat er nu gebeurt....)
maar ik snap dit stuk niet helemaal:
hier staat het orgineel.... http://www.geeksforgeeks.org/check-if-t ... intersect/
maar ik snap dat hele verhaal niet van dat clockwise/counter clockwise colinear...
ik mis toch 1 situatie? want als ik nu 2 parallele lijne heb , die elkaar nooit snijden? ik geloof dat het daar mee fout gaat...
(pff je kan wel zomaar iets knippen en plakken van internet... :-) )
denk dat het daarom niet werkt? althans zou kunnen natuurlijk?
moet ik wel ff flink zoeken wat ik moet omkeren.... toestand...
nee...is toch goed... (ben nu op een stuk papier aan het kijken wat er nu gebeurt....)
maar ik snap dit stuk niet helemaal:
Code: Selecteer alles
FUNCTION StapelPatroon2D::Orientation
VAR_INPUT
Point_p : Points;
Point_q : Points;
Point_r : Points;
END_VAR
VAR_OUTPUT
Orientation : DINT;
END_VAR
VAR
val : Dint;
END_VAR
// To find orientation of ordered triplet (p, q, r).
// The function returns following values
// 0 --> p, q and r are colinear
// 1 --> Clockwise
// 2 --> Counterclockwise
Val := (Point_q.y - Point_p.y) * (Point_r.x - Point_q.x) - (Point_q.x - Point_p.x) * (Point_r.y - Point_q.y);
if val= 0 then
Orientation := 0;
elsif val > 0 then
Orientation := 1;
else
Orientation := 2;
end_if;
END_FUNCTION
maar ik snap dat hele verhaal niet van dat clockwise/counter clockwise colinear...
ik mis toch 1 situatie? want als ik nu 2 parallele lijne heb , die elkaar nooit snijden? ik geloof dat het daar mee fout gaat...
(pff je kan wel zomaar iets knippen en plakken van internet... :-) )
http://www.arjan-swets.com (met cnc filmpjes)