Brauche Hilfe , Bitte ! ,. Vektorrechnug , Schnittpunkt
Übersicht

c64Betreff: Brauche Hilfe , Bitte ! ,. Vektorrechnug , Schnittpunkt |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So ich habe mich nun schon 3 Tage abgeackert und gelernt und es bringt nix, sicher bin ich jetzt ein wenig schlauer ![]() Naja wie auch immer ich habe nun also einen Code zusammengestellt um die Hilfe eurerseits zu vereinfachen ![]() Ich würde Gerne prüfen Ob die beiden Polygone miteinander Collidieren. Mouse Left DOWN = Bewegt kleines POLY Mouse RIGHT DOWN = Bewegt grosses POLY Mouse CNTR DOWN = ROTIERT Zuletzt bewegtes Poly Space Ein und ausschalten des von mir bisher errechneten Zeugs (wobei ich zweifel dass das alles stimmt , naja und wenn es das tun würde bräuchte ich ja keine Hilfe ). Die ganze Collisionsüberprüfung findet in CHK_Collide statt . benutzt werden folgene Punkte für Vektor 1 V1x1 , V1y1 , V1x2 , V1y2 für Vektor 2 V2x1 , V2y1 , V2x2 , V2y2 Also ich habe eigentlich garkein wissen über dieses Thema und alles was ich bis jetzt weiss habe ich in den letzten 3 Tagen gelernt . Nur leider reicht das nicht . ![]() ![]() ![]() ![]() ![]() Und ich denke es wäre bestimmt nicht nur mir geholfen Damit !! Ein ganz Dickes Danke Schonmal ! Code: [AUSKLAPPEN] '///////////////////////////////////////////////////////////////////////////////////// ' ' LINE COLLISIONS MODELL ' ------------------------------- ' ' Referenz : ' ' http://www.harveycartel.org/metanet/tutorials/tutorialA.html#eberly ' ------------------------------------------------------------------- 'http://www.walter-fendt.de/m14d/ 'http://www.euclideanspace.com/physics/dynamics/collision/twod/index.htm 'http://www.mathematik.net/geometrie/ge-001.htm 'http://wiki.delphigl.com/index.php/Tutorial_Lineare_Algebra '///////////////////////////////////////////////////////////////////////////////////// Strict Global show:Int SeedRnd(MilliSecs()) Type TPoint Field POS_X :Float .. , POS_Y :Float .. , CPOS_X :Float .. , CPOS_Y :Float .. , DGR :Float .. , RX :Float .. , RY :Float .. , Collide :Byte .. , PARENT :Tpolygon .. '//////////////////////////////////////////////////// ' ' ' ' Function create:TPoint(_DGR:Float,_RX:Float,_RY:Float) Local NOBJECT:TPoint NOBJECT=New TPoint NOBJECT.rx = _rx NOBJECT.ry = _ry NOBJECT.Dgr = _Dgr Return NOBJECT EndFunction '//////////////////////////////////////////////////// ' ' ' Render ' Method Render() SetColor 50,250,50 DrawOval pos_X-3,pos_Y-3,6,6 EndMethod '//////////////////////////////////////////////////// ' ' ' Render ' Method Update() pos_X=parent.pos_X+(Sin (parent.rotation+dgr)*rx) pos_Y=parent.pos_Y+(Cos (parent.Rotation+dgr)*ry) If Self <> parent.Points.first() ' If pos_X < 0 Parent.pos_X:+26 ' If pos_Y < 0 Parent.pos_Y:+26 ' If pos_X > 600 Parent.pos_X:-26 ' If pos_Y > 600 Parent.pos_Y:-26 EndIf Render() EndMethod EndType Type TVektor Field px1:Float .. , py1:Float .. , px2:Float .. , py2:Float .. Function Create:TVektor(x1:Float,y1:Float,x2:Float,y2:Float) Local NOBJECT:TVektor NOBJECT=New TVektor NOBJECT.pX1=X1 NOBJECT.py1=Y1 NOBJECT.pX2=X2 NOBJECT.py2=Y2 Return NOBJECT EndFunction Method Draw() SetLineWidth 10 SetColor 255,255,255 DrawLine px1,py1,px2,py2 SetLineWidth 8 SetColor 50,100,50 DrawLine px1,py1,px2,py2 EndMethod EndType Type Tpolygon Field pos_X :Float .. , pos_Y :Float .. , pos_X_OLD :Float .. , pos_Y_OLD :Float .. , ROTATION :Float .. , SPD :Float .. , PointS :TLIST .. , Vektors :TLIST .. , RDirection :Float .. Global Point_OBJECTS:TLIST 'M> MOVE 'M> CHECK_COLLIDES Global LIST:TLIST '//////////////////////////////////////////////////// ' ' ' ' Function create:Tpolygon(pos_X:Float,pos_Y:Float) If list=Null list=CreateList() Local NOBJECT:Tpolygon NOBJECT=New Tpolygon NOBJECT.PointS=CreateList() NOBJECT.pos_X=pos_X NOBJECT.pos_Y=pos_Y While NOBJECT.RDirection=0 NOBJECT.RDirection=Rand(-2,2) Wend list.Addlast(NOBJECT) Return NOBJECT EndFunction '//////////////////////////////////////////////////// ' ' ' CHK_COLLIDE ' Method chk_Collide() Local sCP : TPOINT .. , CO : TPOLYGON .. , CV : TVEKTOR .. , V1X1 : Float .. , V1Y1 : Float .. , V1X2 : Float .. , V1Y2 : Float .. , V2X1 : Float .. , V2Y1 : Float .. , V2X2 : Float .. , V2Y2 : Float .. Local DX:Float Local DY:Float Local DP:Float Local NX:Float Local NY:Float Local prj_X1:Float Local prj_Y1:Float Local prj_X2:Float Local prj_Y2:Float Local prj_X3:Float Local prj_Y3:Float SetLineWidth 1 '----------------------------------------------------------- For CO = EachIn LIST If CO <> Self And CO.Vektors For cV = EachIn CO.Vektors V1x1=cv.px1 V1Y1=Cv.py1 V1x2=cv.px2 V1y2=cv.py2 For scp = EachIn Points V2x2 = pos_X V2y2 = pos_Y V2x1 = scp.pos_X V2y1 = scp.pos_Y SetLineWidth 3 SetColor 250,100,100 '----------------------------------------------------------- DX=v1x2-v1x1 DY=v1y2-v1y1 DP=Sqr(DX*DX+DY*DY) NX=DX/DP NY=DY/DP If NX=0 NX=1 If NY=0 NY=1 prj_X1=( DP / (V1x1*v1x2) + (V1y1*v1y2) )*DX prj_Y1=( DP / (V1x1*v1x2) + (V1y1*v1y2) )*DY ' prj_X1=( DP / (DX*DX) + (DY*DY) ) * NX ' prj_Y1=( DP / (DX*DX) + (DY*DY) ) * NY '-------------------------------------------------------- DX=v2x2-v2x1 DY=v2y2-v2y1 DP=Sqr(DX*DX+DY*DY) NX=DX/DP NY=DY/DP If NX=0 NX=1 If NY=0 NY=1 prj_X2=( DP/ (V2x1*v2x1) + (V2y1*v2y2) )*DX prj_Y2=( DP/ (V2x1*v2x2) + (V2y1*v2y2) )*DY ' prj_X2=( DP / (DX*DX) + (DY*DY) ) * NX ' prj_Y2=( DP / (DX*DX) + (DY*DY) ) * NY '----------------------------------------------------------- SetLineWidth 3 SetColor 100,250,100 DrawLine v1x1,v1y1,v1x2,v1y2 SetColor 250,100,100 DrawLine v2x1,v2y1,v2x2,v2y2 If SHOW=1 SetLineWidth 1 SetColor 250,250,250 DrawLine v2x1,v2y1,prj_X2,prj_Y2 DrawLine v1x1,v1y1,prj_X1,prj_Y1 DrawOval v1x1-3,v1y1-3,6,6 DrawOval prj_X1+prj_X2-3,prj_y1+prj_y2-3,3,3 EndIf Next Next EndIf Next EndMethod '//////////////////////////////////////////////////// ' ' ' ADD_Point ' Method add_Point(_DGR:Float,_RX:Float,_RY:Float) PointS.addlast(TPoint.create(_DGR,_RX,_RY)) EndMethod '//////////////////////////////////////////////////// ' ' ' ADD_Vektor ' Method add_Vektor(x1:Float,y1:Float,x2:Float,y2:Float) Vektors.addlast(TVektor.create(x1,y1,x2,y2)) EndMethod '//////////////////////////////////////////////////// ' ' ' Update ' Method UPDATE() ' render Update_vektors chk_COLLIDE EndMethod '//////////////////////////////////////////////////// ' ' ' Render ' Method Update_Vektors() If Points Local VL_px_1:Float .. , VL_py_1:Float .. , VL_px_2:Float .. , VL_py_2:Float .. , VC :Byte .. SetColor 250,250,250 DrawOval pos_X-2,pos_Y-2,4,4 Vektors=CreateList() Local Point:TPoint For Point = EachIn Points Point.parent=Self Point.Update() Select VC Case 0 VL_PX_1=Point.pos_X VL_PY_1=Point.pos_Y VC=1 If VL_PX_2 And VL_PX_1 Add_Vektor VL_PX_2,VL_PY_2,VL_PX_1,VL_PY_1 Case 1 VL_PX_2=Point.pos_X VL_PY_2=Point.pos_Y VC=0 Add_Vektor VL_PX_1,VL_PY_1,VL_PX_2,VL_PY_2 EndSelect Next Local VK_F:TPoint VK_F=TPoint(PointS.first()) Local VK_L:TPoint VK_L=TPoint(PointS.LAST()) Add_Vektor VK_L.pos_X,VK_L.pos_Y,Vk_F.pos_X,VK_F.pos_Y EndIf EndMethod '//////////////////////////////////////////////////// ' ' ' Control ' Method Render() Local l:Int If Vektors Local Vektor:TVektor For Vektor=EachIn Vektors Vektor.Draw() L:+1 Next EndIf Print l EndMethod '//////////////////////////////////////////////////// ' ' ' Control ' Function Control() If list Local POLY:Tpolygon For POLY= EachIn LIST Poly.Update () ' Poly.RENDER () Next EndIf EndFunction EndType '///////////////////////////////////////////////////////////////////////////////////// Global OBJECT_PointS=5 Global p1:TPolygon p1=Tpolygon.create(300,300) For Local cc=0 To Object_Points-1 p1.add_Point ( (360/(Object_Points))*cc,50,50) Next Global p2:Tpolygon p2=Tpolygon.create(300,300) For Local cc=0 To Object_Points-1 p2.add_Point ( (360/(Object_Points))*cc,70,70) Next '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// Function CNTRL() MXS=MXO-MouseX() MXO=MouseX() ps=Null If MouseDown(1) ps=p1 If MouseDown(2) ps=p2 If PS ls=ps PS.pos_X=MouseX() pS.pos_y=MouseY() EndIf If ls And MouseDown(3) ls.rotation :+MXs If KeyHit(key_Space) show=1-show EndFunction '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// Global ps:Tpolygon Global ls:Tpolygon Global MXS :Int .. , MXO :Int .. Graphics 600,600 Repeat If KeyHit(key_escape) End Cls Tpolygon.CONTROL CNTRL Flip Forever |
||
c64 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Habe jetzt von CodeMaster eine Function gefunden die mir schon Ein wenig weiter hilft .
Code: [AUSKLAPPEN] '///////////////////////////////////////////////////////////////////////////////////// ' ' LINE COLLISIONS MODELL ' ------------------------------- ' ' Referenz : ' ' http://www.harveycartel.org/metanet/tutorials/tutorialA.html#eberly ' ------------------------------------------------------------------- 'http://www.walter-fendt.de/m14d/ 'http://www.euclideanspace.com/physics/dynamics/collision/twod/index.htm 'http://www.mathematik.net/geometrie/ge-001.htm 'http://wiki.delphigl.com/index.php/Tutorial_Lineare_Algebra '///////////////////////////////////////////////////////////////////////////////////// Strict Global show:Int SeedRnd(MilliSecs()) Type TPoint Field POS_X :Float .. , POS_Y :Float .. , CPOS_X :Float .. , CPOS_Y :Float .. , DGR :Float .. , RX :Float .. , RY :Float .. , Collide :Byte .. , PARENT :Tpolygon .. '//////////////////////////////////////////////////// ' ' ' ' Function create:TPoint(_DGR:Float,_RX:Float,_RY:Float) Local NOBJECT:TPoint NOBJECT=New TPoint NOBJECT.rx = _rx NOBJECT.ry = _ry NOBJECT.Dgr = _Dgr Return NOBJECT EndFunction '//////////////////////////////////////////////////// ' ' ' Render ' Method Render() SetColor 50,250,50 DrawOval pos_X-3,pos_Y-3,6,6 EndMethod '//////////////////////////////////////////////////// ' ' ' Render ' Method Update() pos_X=parent.pos_X+(Sin (parent.rotation+dgr)*rx) pos_Y=parent.pos_Y+(Cos (parent.Rotation+dgr)*ry) If Self <> parent.Points.first() ' If pos_X < 0 Parent.pos_X:+26 ' If pos_Y < 0 Parent.pos_Y:+26 ' If pos_X > 600 Parent.pos_X:-26 ' If pos_Y > 600 Parent.pos_Y:-26 EndIf Render() EndMethod EndType Type TVektor Field px1:Float .. , py1:Float .. , px2:Float .. , py2:Float .. Function Create:TVektor(x1:Float,y1:Float,x2:Float,y2:Float) Local NOBJECT:TVektor NOBJECT=New TVektor NOBJECT.pX1=X1 NOBJECT.py1=Y1 NOBJECT.pX2=X2 NOBJECT.py2=Y2 Return NOBJECT EndFunction Method Draw() SetLineWidth 10 SetColor 255,255,255 DrawLine px1,py1,px2,py2 SetLineWidth 8 SetColor 50,100,50 DrawLine px1,py1,px2,py2 EndMethod EndType Type Tpolygon Field pos_X :Float .. , pos_Y :Float .. , pos_X_OLD :Float .. , pos_Y_OLD :Float .. , ROTATION :Float .. , SPD :Float .. , PointS :TLIST .. , Vektors :TLIST .. , RDirection :Float .. Global Point_OBJECTS:TLIST 'M> MOVE 'M> CHECK_COLLIDES Global LIST:TLIST '//////////////////////////////////////////////////// ' ' ' ' Function create:Tpolygon(pos_X:Float,pos_Y:Float) If list=Null list=CreateList() Local NOBJECT:Tpolygon NOBJECT=New Tpolygon NOBJECT.PointS=CreateList() NOBJECT.pos_X=pos_X NOBJECT.pos_Y=pos_Y While NOBJECT.RDirection=0 NOBJECT.RDirection=Rand(-2,2) Wend list.Addlast(NOBJECT) Return NOBJECT EndFunction '//////////////////////////////////////////////////// ' ' ' CHK_COLLIDE ' Method chk_Collide() Local sCP : TPOINT .. , CO : TPOLYGON .. SetLineWidth 1 '----------------------------------------------------------- For CO = EachIn LIST If CO <> Self And CO.Vektors For scp = EachIn Points If Pointin( scp,CO) SetColor 255,0,0 DrawOval scp.pos_X-5,scp.pos_Y-5,10,10 EndIf Next EndIf Next EndMethod '//////////////////////////////////////////////////// ' ' ' ADD_Point ' Method add_Point(_DGR:Float,_RX:Float,_RY:Float) PointS.addlast(TPoint.create(_DGR,_RX,_RY)) EndMethod '//////////////////////////////////////////////////// ' ' ' ADD_Vektor ' Method add_Vektor(x1:Float,y1:Float,x2:Float,y2:Float) Vektors.addlast(TVektor.create(x1,y1,x2,y2)) EndMethod '//////////////////////////////////////////////////// ' ' ' Update ' Method UPDATE() render Update_vektors chk_COLLIDE EndMethod '//////////////////////////////////////////////////// ' ' ' Render ' Method Update_Vektors() If Points Local VL_px_1:Float .. , VL_py_1:Float .. , VL_px_2:Float .. , VL_py_2:Float .. , VC :Byte .. SetColor 250,250,250 DrawOval pos_X-2,pos_Y-2,4,4 Vektors=CreateList() Local Point:TPoint For Point = EachIn Points Point.parent=Self Point.Update() Select VC Case 0 VL_PX_1=Point.pos_X VL_PY_1=Point.pos_Y VC=1 If VL_PX_2 And VL_PX_1 Add_Vektor VL_PX_2,VL_PY_2,VL_PX_1,VL_PY_1 Case 1 VL_PX_2=Point.pos_X VL_PY_2=Point.pos_Y VC=0 Add_Vektor VL_PX_1,VL_PY_1,VL_PX_2,VL_PY_2 EndSelect Next Local VK_F:TPoint VK_F=TPoint(PointS.first()) Local VK_L:TPoint VK_L=TPoint(PointS.LAST()) Add_Vektor VK_L.pos_X,VK_L.pos_Y,Vk_F.pos_X,VK_F.pos_Y EndIf EndMethod '//////////////////////////////////////////////////// ' ' ' Control ' Method Render() Local l:Int If Vektors Local Vektor:TVektor For Vektor=EachIn Vektors Vektor.Draw() L:+1 Next EndIf Print l EndMethod '//////////////////////////////////////////////////// ' ' ' Control ' Function Control() If list Local POLY:Tpolygon For POLY= EachIn LIST Poly.Update () ' Poly.RENDER () Next EndIf EndFunction EndType '///////////////////////////////////////////////////////////////////////////////////// Global OBJECT_PointS=5 Global p1:TPolygon p1=Tpolygon.create(300,300) For Local cc=0 To Object_Points-1 p1.add_Point ( (360/(Object_Points))*cc,50,50) Next Global p2:Tpolygon p2=Tpolygon.create(300,300) For Local cc=0 To Object_Points-1 p2.add_Point ( (360/(Object_Points))*cc,70,70) Next '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// Function CNTRL() MXS=MXO-MouseX() MXO=MouseX() ps=Null If MouseDown(1) ps=p1 If MouseDown(2) ps=p2 If PS ls=ps PS.pos_X=MouseX() pS.pos_y=MouseY() EndIf If ls And MouseDown(3) ls.rotation :+MXs If KeyHit(key_Space) show=1-show EndFunction '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// '///////////////////////////////////////////////////////////////////////////////////// Global ps:Tpolygon Global ls:Tpolygon Global MXS :Int .. , MXO :Int .. Graphics 600,600 Repeat If KeyHit(key_escape) End Cls Tpolygon.CONTROL CNTRL Flip Forever Function PointIN(Point:TPOINT,POLY:TPOLYGON) Local Vektor :TVEKTOR .. , px :Int=POINT.pos_X .. , py :Int=POINT.pos_Y .. , s :Int .. For Vektor=EachIn POLY.Vektors Local x1:Float=Vektor.px1 Local y1:Float=Vektor.py1 Local x2:Float=Vektor.px2 Local y2:Float=Vektor.py2 Local x3:Float Local y3:Float If x2<x1 x3 = x2 x2=x1 x1=x3 y3=y2 y2=y1 y1=y3 If (px >=x1) And (pX <=x2) Local yp = y1 +(px -x1) * (y2 -y1 ) / ( x2 - x1 ) If yp <= py Then s=s+1 EndIf Next Return S Mod 2 EndFunction |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group