 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Löwenherz

Anmeldungsdatum: 25.08.2008 Beiträge: 86 Wohnort: auf einer sonnigen Insel :)
|
Verfasst am: 07.08.2009, 20:32 Titel: Distanz zw. zwei Kreisen berechnen |
|
|
schönen guten Abend allerseits !
Ich habe nur eine Frage wie ich die Distanz zw. zwei Kreisen oder Linien
a) berechnen kann
b) die Entfernung in Meter / Zentimeter ausgeben kann
c) wenn die Kreise sich berühren eine Meldung kommt, dass hier eine Kollision stattfindet
habe kein Beispiel hier im Forum gefunden oder anderswo, was verständlich genug wäre. Gesucht habe ich schon, aber ich will keine umständl. Animation mit math. Funktionen berechnen, sondern erst mal ein Grundgerüst haben. Also danach gibt's dann eine Art von Collision. Ein Link wäre toll oder ein Beispiel. Durchfuxen tue ich das dann selbst
Ich brauche nur einen kurzen Tipp, dann versuche ich selbst das gute Teil zs. zubauen!
ich habe das hier gefunden: aber ich bräuchte zwei Kreise mindestens...
script auszug:
Code: | Do
draw_axis
Circle( previous_x, previous_y),5,rgb(0,0,0),,,,F 'rub out old circle
pixels=pixels+speed
get_new_positions
Circle( New_position_x, New_position_y),5,rgb(255,255,255),,,,F 'draw circle
previous_x=New_position_x
previous_y=New_position_y
screensync
'To change direction in zig zag:
If pixels Mod 100 = 0 Then
pixels=0
Old_position_x=New_position_x
Old_position_y=New_position_y
angle=angle+k*copyangle
k=-k
End If |
beste Grüße aus dem sonnigen Sommerland, Löwenherz _________________ Das Leben ist wie eine Pralinenschachtel, man weiß nie, was dort drinnen für tolle wie böse Überraschungen stecken |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 07.08.2009, 20:43 Titel: |
|
|
Abstand zwischen zwei Kreisen ist eigentlich einfach. Abstand zwischen den beiden Mittelpunkten (mittels Satz des Pythagoras), abzüglich der zwei Radien. Oder übersehe ich irgend ein Problem? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 08.08.2009, 05:26 Titel: |
|
|
Code: | Print sqr((abs(x1 - x2) ^ 2) + (abs(y1 - y2) ^ 2)) |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 08.08.2009, 10:06 Titel: |
|
|
Das ABS ist nicht nötig; wird durch das Quadrat sowieso positiv. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 08.08.2009, 12:18 Titel: |
|
|
es kann ja nicht schaden, es noch positiver werden zu lassen!  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 08.08.2009, 14:15 Titel: |
|
|
Argh, Mist, Fehler ... ein Quadrat muss ja gar nicht positiv sein, ebenso wenig wie ein Betrag.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 08.08.2009, 14:19 Titel: |
|
|
ja, es könnte auch 0 sein oO
solang du nicht mit imaginären werten arbeitest sind quadrate immer positiv.. Oo beträge weiß ich spontan nicht, müsst ich drüber nachdenken und da hab ich grad keine lust zu  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 08.08.2009, 14:39 Titel: |
|
|
Beträge sind immer >= 0, weil es eine spezielle Form einer Norm ist. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Löwenherz

Anmeldungsdatum: 25.08.2008 Beiträge: 86 Wohnort: auf einer sonnigen Insel :)
|
Verfasst am: 13.08.2009, 20:41 Titel: |
|
|
hi, bin wieder zurück, war im Kurzurlaub in den Bergen, klasse Mann! Habe meine Höhenangst fast komplett überwunden!
Also, nochmal, ich vesuche genau einen Punkt in der Mitter des ersten Kreises zu bilden und das gleiche mit dem zweiten Kreis. Dann möchte ich die Distanz der Zentren voneinander berechnen... danach möchte ich das ganze animieren, soll nur eine kleine Lernübung für mich sein
danke an puppetmaster für die Formel ! das war hilfreich.
habe das bisher gebaut als neues Gerüst :
Code: |
screen 12
dim as integer x,y
dim as long distanz
circle(200,200),100
circle(360,360),80,4
randomize timer
x=int(rnd*300)+1
y=int(rnd*200)+1
PSET (x,y)
distanz = SQR((x - 200) ^ 2 + (y - 200) ^ 2)
IF distanz > 100 THEN
PRINT "Punkte auserhalb des Kreises"
ELSEIF distanz = 100 THEN
PRINT "Punkte auf dem Kreis"
ELSE
PRINT "Punkte im Kreis"
END IF
PSET (x+50,y+50),11
getkey
sleep |
mir wäre um konstruktive Hilfe sehr gebeten
grüße, löwenherz _________________ Das Leben ist wie eine Pralinenschachtel, man weiß nie, was dort drinnen für tolle wie böse Überraschungen stecken |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 13.08.2009, 21:46 Titel: |
|
|
Wobei brauchst du Hilfe? Sieht doch schon ganz gut aus.
Wenn es dir nur darum geht, ob der Punkt im Kreis liegt, dann kannst du auch das SQR weglassen und das Ergebnis mit 10000 (=100^2) vergleichen. Ist etwas genauer und schneller. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 14.08.2009, 09:54 Titel: |
|
|
Falls Du Dich für geometrische Berechnungen generell interessierst:
http://beilagen.dreael.ch/Diverses/WinUAE/DarstellungKorrekt.gif
http://beilagen.dreael.ch/QB/MINICAD.ZIP
Das Ganze war einmal ein von mir bereits vor gut 20(!) Jahre gestartetes CAD-Programmprojekt (wurde aber nie fertig), damals sogar noch auf einem Commodore Amiga 500 (siehe Screenshot erster Link).
Habe aber später einmal einige Codeteile unter Verwendung von TYPE nach QB 4.5 portiert; Du findest es in der .ZIP-Datei oben. Für Deinen Fall dürfte T_GEOM_B.BAS (Testprogramm Geometrieroutinen; beachte also die $INCLUDEs aufgrund des modularen Aufbaus) von Interesse sein: Dinge wie Schnittpunkte zwischen Linien und Kreise berechnen sowie beispielsweise auch rechtwinkliger Abstand eines Punktes zu einer Linie sind dort implementiert.
Die Codebeispiele müssten übrigens in FreeBasic weitgehend 1:1 lauffähig sein. das eine oder andere könnte dort sogar noch optimiert werden, z.B. dass BerechneSchnittpunktLinieLinie() als FUNCTION direkt den Schnittpunkt als Record-TYPE zurückliefert. Lediglich einige Basisroutinen, z.B. Linie XOR-verknüpft zeichnen und CALL INTERRUPTs müssten angepasst werden. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Löwenherz

Anmeldungsdatum: 25.08.2008 Beiträge: 86 Wohnort: auf einer sonnigen Insel :)
|
Verfasst am: 14.08.2009, 14:30 Titel: |
|
|
danke dreael für die Infos und deine CAD Beispiele! Wenn ich Zeit habe checke ich das mal durch. Bei uns ist am WE nur großes Heimatfest, deswegen habe ich erst mal keine Zeit
hier der passende Code mit zwei Kreisen, den ich gesucht habe:
Code: | '====================================================================
' Zwei Kreise
'====================================================================
Randomize Timer * 1e6
Dim As Integer xs, ys
Screeninfo xs, ys
Screenres xs, ys, 4
Dim As String s
Dim As Double h = ys / 2
Dim As Double q = ys / 4
Dim As Double xc1, yc1, rc1 ' Kreis 1
Dim As Double xc2, yc2, rc2 ' Kreis 2
Dim As Double dx, dy, beruehren, distanz ' separation
'--------------------------------------------------------------------
Do
Cls
'--------------------------------------------------------------------
' erster kreis
xc1 = Rnd * h + q
yc1 = Rnd * h + q
rc1 = 10 + ys * Rnd / 5
Circle(xc1, yc1), rc1, 14
Pset (xc1, yc1), 14
'--------------------------------------------------------------------
' zweiter kreis
xc2 = Rnd * h + q
yc2 = Rnd * h + q
rc2 = 10 + ys * Rnd / 5
Circle(xc2, yc2), rc2, 13
Pset (xc2, yc2), 13
Line (xc1, yc1)-(xc2, yc2), 7
'--------------------------------------------------------------------
beruehren = rc1 + rc2
dx = xc1 - xc2
dy = yc1 - yc2
distanz = Sqr(dx*dx + dy*dy)
Print
Print " Esc druecken, anderer Key fuer Aktion wiederholen."
Print
If distanz > beruehren Then
Print " kreise beruehren sich nicht"
Else
Print "kreise ueberlappen sich"
End If
print
print "distanz ist: "; distanz
print
'--------------------------------------------------------------------
Do ' warten bis key gedrückt
s = Inkey
Loop Until s <> ""
If Asc(s) = 27 Then Exit Do ' esc drücken für exit
Loop
'====================================================================
Sleep
'====================================================================
|
Tip: außer ESC irgend einen anderen Key drücken, um die sich zu veränderten Kreise samt Verbindung und Entfernungen zu bekommen. kommt bald noch mehr.
beste Grüße, löwenherz _________________ Das Leben ist wie eine Pralinenschachtel, man weiß nie, was dort drinnen für tolle wie böse Überraschungen stecken |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|