Objekte auf bestimmter Strecke anordnen
Übersicht

![]() |
M0rgensternBetreff: Objekte auf bestimmter Strecke anordnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey Leute.
Entschuldigung, wenn ich im falschen Themenbereich bin, aber ich weiß echt nicht wo dieses Anliegen hingehört. Es geht weniger um den Code an sich, sondern eher um die Technik/Mathematik bei folgendem Problem: Ich habe eine Linie, die sagen wir mit der Maus gezogen wird. Jetzt will ich bestimmte Objekte (Vierecke), die alle die gleiche Breite und Höhe haben, in einem bestimmten Abstand hintereinander auf dieser Linie verteilen. Mein Problem ist nun: Wie berechne ich die Koordinaten der einzelnen Objekte? Ich glaube, dass man dazu Vektoren bräuchte, aber damit kenn ich mich leider absolut (noch) nicht aus. Bin mir aber nicht sicher ob ich das bräuchte, wüsste aber auch nicht wie man es sonst machen könnte. Hat jemand von euch vielleicht ne Idee? Lg, M0rgenstern |
||
Lion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
BlitzMax: [AUSKLAPPEN] Graphics 800, 600, 0, 50 Ich glaub, ich hab das problem nicht verstanden? o.O |
||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
![]() |
The Shark |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da gibts mehere möglichkeiten:
1. abstand und winkel berechnen und dann mit sinus/cosinus punkte bestimmen 2. Gerade durchlegen, d.h. - Steigung berechnen - C Bestimmen (m*x+c) - horizontaler unterschied bestimmen - bei den stellen y-position ausrechnen 3. horizontaler und vertikaler abstand ausrechnen und einteilen <- am schnellsten |
||
- Zuletzt bearbeitet von The Shark am Sa, Apr 03, 2010 18:40, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Winkel von Startpunkt bis Endpunkt der Linie mit Atan2![]() x = StartX + cos(winkel) * Abstand y = StartY - sin(winkel) * Abstand Wobei du Abstand mit jedem Objekt um einen festen Wert erhöhst. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
DaysShadow |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit Vektoren:
BlitzMax: [AUSKLAPPEN] SuperStrict Ist vielleicht schwieriger zu verstehen, allerdings empfinde ich die Vektorenvariante meistens als einfacher nachzuvollziehen. Es lohnt sich jedenfalls sich mit Vektoren anzufreunden ![]() In der For-Schleife mit Step 20 kannst du die Abstände einstellen, statt 20 halt 50 oder sonstwas schreiben. MfG DaysShadow |
||
Blessed is the mind too small for doubt |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, vielen Dank für die schnellen Antworten.
Ich hab das ganze mit Sinus und Cosinus jetzt versucht in Code umzusetzen, funktioniert aber noch nicht ganz, da ich mit dem ATAN2 einfach nicht klar komme. Ich hab hier mal den Code der Funktion: BlitzMax: [AUSKLAPPEN] Function Line(x:Int, y:Int, Firstx:Int, Firsty:Int, choosenButton:TButton) @DaysShadow: Ich würde mich sofort mit Vektoren anfreunden, wenn ich das ganze verstehen würde. Das Thema kommt leider erst nächstes Schuljahr und die Leute die ich kenne, die das Thema beherrschen haben sich leider bisher nie die Zeit genommen mir das mal zu erklären. Sonst würde ich lieber damit arbeiten, weils mir einfacher und felxibler erscheint. Lg, M0rgenstern |
||
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
http://www-e.uni-magdeburg.de/...chnung.pdf hat mir geholfen. Vektoren mögen zu Beginn vielleicht ein wenig komplex anmuten, doch sie sind an sich sehr einfach (vor allem, da man sie sich geometrisch verdeutlichen kann). | ||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mal deinen Code korrigiert und ein kleines Testprogramm dazu erstellt:
BlitzMax: [AUSKLAPPEN] SuperStrict Ein paar Teile hatte ich wegnehmen/ändern müssen, damit der Code bei mir funktioniert. Es waren nur drei kleine Fehler drin: 1. Die y-Richtung war gespiegelt 2. Du hast vergessen, die "Linienbewegung" mit einem Faktor, der von der Länge der Stecke abhängig ist, zu multiplizieren. 3. Länge und Richtung mussten wegen sonst entstehenden Ungenauigkeiten zu Floats werden. Zu den Vektoren: n-halbleiter scheint eine gute Seite gefunden zu haben. Falls allerdings Fragen bestehen, gehöre ich zu denen, die Zeit haben. ![]() mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also.
@mpmxyz: Ich hab jetzt mal meinen Code umgeschrieben und das ganze funktioniert ausgezeichnet. Natürlich ist der Code momentan relativ schlecht strukturiert, ich muss das alles nochmal sauber schreiben. Vielen Dank. Aber: Das mit den Vektoren hab ich mir jetzt mal in den Kopf gedonnert. Ich peils trotzdem nicht. Ich habs soweit verstanden, dass ein Vektor eine Verschiebung angiebt. Also z.B. bei zwei Punkten gibt der Vektor an wie der eine Punkt zum anderen verschoben ist. WEnn man Vektoren gegeneinander aufaddiert erhält man einen neuen Vektor der eine neue Verschiebung angiebt. Das hab ich verstanden. Aber weiter komm ich auch nicht. Ich wüsste auch nicht, wie ich mit dem ganzen Zeug rechnen sollte. Wenn ich z.b. ein Koordinatensystem habe und da die Verschiebung von Punkten berechnen sollte. Dann müsste man ja eigentlich die XKoordinate des einen Punktes von der XKoorinate des anderen Punktes subtrahieren, das mal i rechnen (wobei ich nicht verstehe was genau i bzw. j ist), das gleiche mit den y-Koordinaten und j machen und das ganze addieren. Aber was wäre das Ergebnis? Also, dann bekommt man ein Ergebnis raus und weiß nun was genau? Und wie das ganze dann für mathematische Probleme in Code umzusetzen wäre ist mir auch noch ein Rätsel. Lg, M0rgenstern |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, der Teil ist ein bischen umständlich formuliert.
Der Vektor i ist der Vektor der x-Achse und der Vektor j ist der der y-Achse. (Die mathematische Sprache neigt teilweise dazu, etwas umständlich zu werden. ![]() Unterm Strich wird der Vektor in verschiedene Teile, die Komponenten, aufgeteilt. Diese Komponenten sind nun nicht mehr Vektoren sondern nur noch einfache Zahlen. Der dreidimensionale Vektor A lässt sich z.B. so schreiben: (Ax|Ay|Az) Die Berechnungen in der Komponentendarstellungen sind dann die, mit denen man dann programmiert. Das sollte dir beim Weiterlesen helfen. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm...
Also, ich fasse mal zusammen wie weit ich jetzt mit meinem Verständnis bin: Wenn ich einen Punkt, sagen wir A, mit den Koordinaten (5/8) und einen Punkt B mit den Koordinaten (7/10) habe und den Vektor zwischen diesen beiden Punkten berechnen will, dann muss ich folgendes rechnen: Ortsvektor B- Ortsektor A = Vektor c. Und da der Ortsvekter von A und B die gleichen Koordinaten hat wie jeweils die Punkte kann man die übernehmen. Explizit muss man also rechnen: (7-5)*i+(10-8)*j = Vektor c Hier habe ich immernoch das Problem: i und j sind die Vektoren der Achsen. Aber welchen Wert haben die? Ich habe gelesen, dass die den Wert 1 haben, aber warum dann noch in die Rechnung miteinbeziehen? Dann habe ich den Vektor c mit (2/2). Die Länge davon kann man dann folgendermaßen berechnen: Pythagoras auf die Komponenten anwenden, also: sqrt(2²+2²) = Verktorlänge (Hier 2,8). Für mein oben genanntes Problem müsste ich ja jetzt die Länge Teilen durch die Größe der Objekte samt Abstand. Also, sagen wir mal so ein Objekt nimmt mit dem "Sicherheitsabstand" insgesamt 0,6 ein, dann müsste ich 2,8/0,6 = 4,7, also 5 Objekte könnte man auf diese Strecke bringen. Und hier fangen dann meine Probleme wieder an. Ich hab mir überlegt, dass man nun den Vektor c durch die Anzahl der Objekte teilen müsste, das wäre dann im Ergebnis (0,4/0,4). Und dann multipliziert man die Objektnummer mit diesem Ergebnis und Multipliziert dies zum Ortsvektor von Punkt A. Also Für Objekt 2 z.b.: (0,4/0,4) * 2 = (0,8/0,8) -> (0,8/0,8) * (5/8) = (4/6,4) Wir ihr seht wären die Koordinaten nun aber vollkommener Blödsinn. Ich komme also wieder nich weiter und den letzten Teil hab ich mir auch nur irgendwie zusammengereimt. Also, bei der Sache mit der Länge bin ich mir noch sicher und dass man diese durch die Größe der Objekte teilen muss auch. Weiter komm ich aber nicht. Tut mir leid, wenn ich euch so damit belämmer, aber ich werde aus der PDF Datei nicht 100%ig schlau, bin aber wenigstens schonmal ein wenig vertrauter mit der ganzen Sache. Lg, M0rgenstern |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kurz vor Ende hast du den Fehler eingebaut:
Zitat: (0,8/0,8) * (5/8)
Wenn man einen Vektor an einen anderen Vektor dransetzen möchte - das möchtest du ja - muss man die Vektoren miteinander addieren. Eine erklärende Begründung, dass du sie aneinandersetzen musst, fällt mir leider gerade nicht ein; mache dir mal eine kleine Zeichnung. Zeichnungen kann ich für Problemlösungen übrigens wärmstens empfehlen. Dann hat man es viel einfacher, eine Lösung auf Vektorbasis zu finden. Sonst muss ich aber sagen, dass du gut gelernt zu haben scheinst. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, vielen Dank.
Natürlich, ist eigentlich total logisch, wenn man das so sieht. Zu den Zeichnungen: DIe hab ich hier en masse vor mir liegen^^. Habs jetzt endlich verstanden. Damit lässt sich dann super arbeiten. Ich glaube, damit kann man viele Probleme sauber und einfach und schnell lösen. Vielen Dank. Lg, M0rgenstern |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group