Rekenhulp gevraagd...

Gewoon even offtopic praten over van alles en nog wat.

Moderator: Moderators

Gebruikersavatar
DaBit
Donateur
Berichten: 11014
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Rekenhulp gevraagd...

Bericht door DaBit »

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'
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

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....

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)
Gebruikersavatar
DaBit
Donateur
Berichten: 11014
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Rekenhulp gevraagd...

Bericht door DaBit »

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.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

ik geloof niet dat dit verhaal helemaal werkt...

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)
Gebruikersavatar
DaBit
Donateur
Berichten: 11014
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Rekenhulp gevraagd...

Bericht door DaBit »

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'
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

DaBit schreef:Met 2 volledig verticale of horizontale lijnstukken gebeurt dat inderdaad. Niet het meest handige stukje code dat je gejat hebt.
ja zag het ook nu...

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)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

Code: Selecteer alles

return (val > 0)? 1: 2;
wat doet dit?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Breaker
Donateur
Berichten: 1956
Lid geworden op: 26 mei 2015 22:43
Locatie: Nabij Antwerpen
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Breaker »

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...
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

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
}
dit staat er totaal...

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;
ergens gaat er iets nog niet goed... zijn die 2 bovenstaande verhaaltjes zo'n beetje het zelfde?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Breaker
Donateur
Berichten: 1956
Lid geworden op: 26 mei 2015 22:43
Locatie: Nabij Antwerpen
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Breaker »

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:

Code: Selecteer alles

x=a
y=b
z=c
onSegment(x,y,z)
En niet de variabelen in de functie definiëren:

Code: Selecteer alles

onSegment(x=a, y=b, z=c)
Geduld is een schone zaak, frezen niet...
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

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/

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)
Gebruikersavatar
Breaker
Donateur
Berichten: 1956
Lid geworden op: 26 mei 2015 22:43
Locatie: Nabij Antwerpen
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Breaker »

'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

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...
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

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)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Rekenhulp gevraagd...

Bericht door Swets »

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:

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
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... :-) )
http://www.arjan-swets.com (met cnc filmpjes)
Plaats reactie