Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Abstand Punkt/Gerade oder Schnittpunkt kreis/Gerade gesucht
catweasel - Di 23.12.08 16:11
Titel: Abstand Punkt/Gerade oder Schnittpunkt kreis/Gerade gesucht
Hi,
ich versuche gerade eine Funktion zu basteln die feststellt ob ein Kreis und eine Strecke Schnittpunkt(e) haben. Dies sollte dann der Fall sein wenn der kuerzeste Abstand "D" von Gerade-Kreismittelpunkt nicht groesser als der Radius "R" ist, also D<=R.
Ich weiss zwar dass ich die Steigung der Strecke mit dy/dx herausbekomme und das die Geradennormale sich als Gerade mit negative Steigung (im Bezug auf die eigentlich Gerade) ermitteln laesst. Ausserdem ist einleuchtend dass D auf genau auf einer solchen Geraden liegt.
Mein Problem ist nur:
- Ich hab von vektorrechnung so viel ahnung wie ein Schimpanse von Raumfahrt. (Schonmal gemacht aber keine Ahnung gehabt was ich da eigentlich mache)...
- 85% aller googlebaren Beispiel gehen das ganze vektoriell an.
- Irgendwie verstehe ich das mit den "Hilfsebenen" in den Besispielen nicht.
Kann mir bitte jemand helfen eine Funtion zu basteln,etwa nach folgendem Schema:
(Es kann durchaus auch eine Loesung mit Vektorrechnung sein. ich verspreche auch das ich das dann zu verstehen versuche).
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type TLine = record A : TPoint; B : TPoint; end;
type TSprite = record center : TPoint; radius : integer; end;
function collision(reflector:Tline,sprite:TSprite); begin end; |
Waere echt super wenn mir da jemand helfen koennte.... Es ist doch Weihnachten.... :roll:
Ich will doch so gerne das Rad neu erfinden und das beste Nachmach-Arkanoid-wo-gibt, naja jedenfalls ein Breakout-Clone schreiben... :wink:
Frohes Fest :D
-Catweasel
ub60 - Di 23.12.08 17:04
Also es geht auch ohne Vektoren:
- Anstieg m1 der Geraden bestimmen mit Zweipunktgleichung
- Anstieg m2 der senkrechten Schnittgeraden bestimmen mit m2=-1/m1
- Funktionsgleichung der zweiten Geraden bestimmen (Punkt-Anstiegs-Gleichung)
- Schnittpunkt der beiden Geraden bestimmen (Gleichungssystem)
- Abstand der Punkte mit Pythagoras
Ganz schöner Aufwand, ev. gehts ja einfacher :lol:
ub60
Kha - Di 23.12.08 17:15
Titel: Re: Abstand Punkt/Gerade oder Schnittpunkt kreis/Gerade gesucht
catweasel hat folgendes geschrieben : |
ich versuche gerade eine Funktion zu basteln die feststellt ob ein Kreis und eine Strecke Schnittpunkt(e) haben. |
Das funktioniert auch ohne viel Vektorrechnung, jedenfalls ohne Skalarprodukt oder ähnlich Schreckliches ;) :
http://www.matheboard.de/thread.php?postid=10217#post10217
Der rein vektorielle Weg steht ein wenig drüber als letzter Punkt unter "Geraden".
Bei allen Verfahren musst du nach dem Schnitt Gerade-Kreis das Ergebnis natürlich noch auf deine
Strecke übertragen.
@ub60: Und ein paar Fallunterscheidungen, wenn eine der Geraden senkrecht ist ;) .
catweasel - Do 22.01.09 14:55
Hi,
also ich habe mich jetzt einmal etwas damit beschaeftigt und bin zu folgendem Zwischenergebnis gekommen: Ich mach das ganze nun doch mit Vektoren. Hab mich da halt ein bischen reinlesen muessen, aber ging ganz gut.
mein Problem ist im Moment allerdings die performance. mein "Sprite" besteht aus einer TShape-Komponenete die ueber einer paintbox verschoben wird. Allerdings kriecht die Shape selbst bei einer reinen Bewegungsschleife (ohne Kollisionstetsts) nur im Schneckentempo ueber das Formular.
Ich spiele schon fast mit dem Gedanken DelphiX zu verwenden, wollte das ganze am liebsten aber ohne Harwarebeschleunigung per reinem "Software-Rendering" loesen.
Achja: Wenn ich anstelle einer Shape das Sprite (als Kreis) in die Paintbox integriere, wirds noch uebler.....
Catweasel.
Maweki - Do 22.01.09 15:59
Wie genau hast du denn jetzt das verschieben gemacht (bisschen Code vielleicht) bzw. muss das verschieben Pixelweise passieren bzw. muss man den Vorgang sehen (sonst koennteste den Vorgang natuerlich beschleunigen, in dem du das neuzeichnen deaktivierst).
Was hast du letztendlich eigentlich vor? Vielleicht gibt es ja einen sinnvolleren/performanteren Weg.
Maweki - Do 22.01.09 19:18
Darum habe ich gefragt. Konnte man nicht einfach
Delphi-Quelltext
1: 2: 3:
| Image1.Updating; Image1.Updated; |
Und in der Zwischenzeit wird das nicht neugezeichnet.
Mir war sowas wie "BeginUpdate" und "EndUpdate", aber ich sitz' hier auf Lazarus. Sollte aber eigentlich das Selbe sein.
BenBE - Do 22.01.09 19:22
Du kannst mit Form.Canvas.FillRect und Form.Canvas.Ellipse recht schnell zeichnen. Schau Dir zur Not auch mal Double-Buffering mit einem unsichtbaren Bitmap-Puffer an.
Alternativ: Mit Masken kann man aux XOR-basiert zeichnen; Code dafür müsst ich raussuchen ...
Maweki - Do 22.01.09 19:28
Double-Buffering hilft doch aber nur gegen das Flackern und ist nicht performancezuträglich.
Fakt ist:
wenn du auf eine dauernde, stetige und flüssige Bewegung aus bist, kommst du sicherlich um DirectDraw nicht herum. Die normale GDI brint's da einfach nicht.
Wenn dein Objekt im Grunde nur einmal gezeichnet wird und dann feststehend bleibt: Erst im Hintergrund zeichnen (Update verhindern) und dann im ganzen darstellen lassen.
GDI und der Versuch flüssiger Bewegungen bringt nur Kopfschmerzen.
silverhammer - Sa 24.01.09 12:40
Du willst wahrscheinlich keine Erklärungen und keine Diskussion über sprites und doublebuffering sondern eine fertige Funktion. Du kriegst eine fertige Funktion.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| uses Math;
function Abstand(L: TLine; P: TPoint): Double; var VX, VY, WX, WY, W: Double; begin WX := L.B.X - L.A.X; WY := L.B.Y - L.A.Y; W := hypot(WX, WY); if W = 0 then raise Exception.Create('Line.A und Line.B sind gleich und definieren daher keine Gerade !!');
VX := P.X - L.A.X; VY := P.Y - L.A.Y; result := abs(VX*WY - VY*WX)/W; end; |
Das Ergebnis folgt aus dem minimalen Abstand von Punkt und Gerade und funktioniert daher
für alle Geraden - auch die horizontal und vertikal verlaufenden. Es muss geprüft werden
ob die Punkte A und B von L wirklich verschieden sind. Andernfalls sind, gibts eine
Fehlermeldung.
Moderiert von
Kha: Delphi-Tags hinzugefügt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!