AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kollision mit Farbe

Ein Thema von Notxor · begonnen am 31. Okt 2009 · letzter Beitrag vom 2. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
Notxor

Registriert seit: 28. Okt 2009
41 Beiträge
 
Delphi XE2 Professional
 
#1

Kollision mit Farbe

  Alt 31. Okt 2009, 17:47
Tag auch, hoffe die Frage ist nicht zu trivial, aber wie schafft man es, dass eine Kugel (hab ich schon) mit einem Shape kollidiert?
Wenn ich es so mache, dass ich die Distanz zwischen Shape und Kugel prüfe klappt auch alles wunderbar, nur wäre es besser, wenn er nicht auf das shape direkt reagiert, sondern eher auf die farbe.
Am besten wäre die Farbe "unter" der Kugel (mx,my). Kann man die irgendwie abrufen wenn die kugel sich selbst darüber befindet?

Ach ja, kann man einfach ein Rechteck mit canvas auf die Form zeichnen OHNE image/paint Feld? Ein Error kommt zwar nicht wenn ich es versuche, aber das Rechteck auch nicht.

Hoffe mein WirrWarr an Fragen war einigermaßen verständlich und es erbarmt sich jemand, mir zu helfen .

  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Kollision mit Farbe

  Alt 31. Okt 2009, 18:13
Durch die erste Frage bin ich jetzt nicht ganz durchgestiegen.

Zur zweiten Frage:
Auf OnPaint reagieren und dann mit Rectangle(X1,Y1,X2,Y2) zeichnen.
Marvin
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Kollision mit Farbe

  Alt 31. Okt 2009, 18:16
Zitat von Notxor:
nur wäre es besser, wenn er nicht auf das shape direkt reagiert, sondern eher auf die farbe.
Nein, der geometrische Ansatz ist definitiv überlegen. Wenn du das schon hast, wäre eine Pixelprüfung ein Rückschritt. Lass es besser wie es ist.

Zitat:
Ach ja, kann man einfach ein Rechteck mit canvas auf die Form zeichnen OHNE image/paint Feld? Ein Error kommt zwar nicht wenn ich es versuche, aber das Rechteck auch nicht.
Du kannst natürlich mit Form.Canvas.Rectangle() z.B. direkt auf's Formular zeichnen, allerdings musst du dies dann im Ereignis TForm.OnPaint tun, da es sonst nicht neu gezeichnet wird nachdem irgend etwas dazu geführt hat dass es verdeckt bzw. nicht sichtbar war.
Eine PaintBox zeichnet letztlich auch auf den Canvas des Formulars (hat also keinen eigenen).
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Notxor

Registriert seit: 28. Okt 2009
41 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Kollision mit Farbe

  Alt 31. Okt 2009, 18:32
Ok, das mit OnPaint habe ich jetzt.

Auch wenn es ein Rückschritt ist, habe ich sonst keine Idee wie ich es sonst machen sollte.
Es geht um den Tascheneinlauf beim Snooker/Billard. Und den kann ich mit Shapes nicht sonderlich gut darstellen, weshalb ich ihn als Bild etc einfügen/zeichnen wollte und die Kollision dann mit den Pixeln machen.

Irgendwie habe ich mich darauf festgebissen, komme einfach auf keine andere Idee als die Pixelkollision.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.054 Beiträge
 
Delphi 12 Athens
 
#5

Re: Kollision mit Farbe

  Alt 31. Okt 2009, 18:43
Pixelabfragen sind aber seh unperformant und man kann auch schnell mal was übersehn.

Abgesehn davon ist es nicht einfach von einem Canvas die Pixelfarbe abzufragen, wenn wenn mal irgendwas über dem Pixel ist, dann gibt es diese Farbe nicht mehr.

Nimm den Mittelpunkt der Kugel und einen oder mehrere Punkte innerhalb der Taschen und rechne dir die Abständer der Punkte aus.
Ist einer der Abständer kleiner als die entsprechenden Radien, dann ist der "Ball" drinnen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Notxor

Registriert seit: 28. Okt 2009
41 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Kollision mit Farbe

  Alt 31. Okt 2009, 19:23
Gut, werde das mal so versuchen. Bringt mich aber zur nächsten Frage, wie/ob man die Stärke der Rundung der gerundeten Rechtecke abfragen/verändern kann.

Edit: ok, ich glaube, diese Frage hat sich erledigt.
Edit: oder auch nicht . Mit canvas kein Problem, aber kann man das auch bei Shapes direkt einstellen?
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Kollision mit Farbe

  Alt 31. Okt 2009, 19:32
Ist der Punkt im Kreis: x² + y² < r²
  Mit Zitat antworten Zitat
Notxor

Registriert seit: 28. Okt 2009
41 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Kollision mit Farbe

  Alt 31. Okt 2009, 22:15
Hmm, neues Problem.
Wenn ich versuche, einen Ball von einer beliebigen Seite eines Shapes (Rechteck) zurückzuwerfen, verfangen sich die Bälle am Shape und "zappeln" hin und her.

Code:
if (x-(shape1.Left+shape1.width)<=r) and (y>=shape1.top)and(y<=shape1.top+shape1.height)and (vx<0)
then vx := -vx*reibungbande;           //von rechts nach links

if (Y-(shape1.top+shape1.height)<=R) and (x>=shape1.left)and(x<=shape1.Left+shape1.Width) and (vy<0)
then vy := -vy*reibungbande;         //unten oben

if ((shape1.left)-x <= r)and(y>=shape1.top)and(y<=shape1.top+shape1.height)and (vx>0)
then vx := -vx*reibungbande;                      //links rechts

if (shape1.Top-y<=r) and (x>=shape1.left)and(x<=shape1.Left+shape1.Width) and (vy>0)
then vy := -vy*reibungbande;                       //oben unten
V sind die Geschwindigkeiten, r der Radius, x/y der Mittelpunkt des Balls.
Wenn ich beide horizontalen oder vertikalen Abfragen gleichzeitig aktiviere kommt das Problem, und ich hab leider keine Idee, wie ich das verhindern kann.
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Kollision mit Farbe

  Alt 1. Nov 2009, 00:12
Es gibt die möglichkeit mit Vektorrechnung herauszufinden, ob der Ball sich denn momentan auch wirklich
auf das Objekt zubewegt, mit dem er wohl kollidiert.
Ich hab das selbst mal so gemacht.

Dazu nimmt man das Punkt-Produkt aus Abstand(Ball <-> Mittelpunkt des Objektes) und dem Geschwindigkeitsvektor
des Balles

Delphi-Quellcode:
  If VectorDotProduct(VectorSub(Ball.Pos, Object.Pos), Ball.vel) < 0 then
  begin
    [...]
  end;
ANMERKUNG: Weil ich das jetzt nicht nachgeprüft hab, könnte es auch sein das da anstatt "< 0" stattdessen
"> 0" stehen muss.

MFG
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Kollision mit Farbe

  Alt 1. Nov 2009, 02:48
Du kannst als sehr einfache Lösung den Ball bei Kollision einfach manuell an den Rand des Shapes zurechtschieben. Einfach in Richtung des neuen Vektors um die Länge (R1+R2)-||M2-M1||+e von seiner Position aus, oder von M1 aus um die Länge R1+R2+e verschieben. (M1=Mittelpunkt des Kollisionspartners; M2=Mittelpunkt des Balls; R1=Radius des Kollisionspartners; R2=Radius des Balls; e=epsilon, sehr kleiner Wert um zu umgehen, dass kleinste Rechenungenauigkeiten bei Floats dazu führen, dass die Verschiebung ganz knapp zu kurz ausfällt; ||x||=Länge von x)

Der ganz korrekte Weg wäre es festzustellen ob eine Kollision passieren wird, bevor du die Verschiebung ausführst. Durch Berechnung des Schnittpunktes weisst du genau wo (bzw. wann) die Kollision zwischen den Schritten auftritt, und du kannst den Restvektor zum Shape-Rand (V1) sowie den verbleibenden Anteil des reflektierten Vektors (V2) berechnen. Dann verschiebst du nachher um V1+V2, gibst aber dem Ball die Geschwindigkeit Norm(V2)*(||V1||+||V2||)*k (k=Konstante die den Energieverlust beim Stoß beschreibt), bzw. Norm(V2)*||V0||*k (V0=Geschwindigkeit des Balls vor der Kollision).
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz