Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Distanz zw. zwei Kreisen berechnen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Löwenherz



Anmeldungsdatum: 25.08.2008
Beiträge: 86
Wohnort: auf einer sonnigen Insel :)

BeitragVerfasst am: 07.08.2009, 20:32    Titel: Distanz zw. zwei Kreisen berechnen Antworten mit Zitat

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 lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 07.08.2009, 20:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 08.08.2009, 05:26    Titel: Antworten mit Zitat

Code:
Print sqr((abs(x1 - x2) ^ 2) + (abs(y1 - y2) ^ 2))



MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 08.08.2009, 10:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 08.08.2009, 12:18    Titel: Antworten mit Zitat

es kann ja nicht schaden, es noch positiver werden zu lassen! lachen
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 08.08.2009, 14:15    Titel: Antworten mit Zitat

Argh, Mist, Fehler ... ein Quadrat muss ja gar nicht positiv sein, ebenso wenig wie ein Betrag. weinen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 08.08.2009, 14:19    Titel: Antworten mit Zitat

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 Zunge rausstrecken
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 08.08.2009, 14:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Löwenherz



Anmeldungsdatum: 25.08.2008
Beiträge: 86
Wohnort: auf einer sonnigen Insel :)

BeitragVerfasst am: 13.08.2009, 20:41    Titel: Antworten mit Zitat

hi, bin wieder zurück, war im Kurzurlaub in den Bergen, klasse Mann! grinsen 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 lächeln

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 grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 13.08.2009, 21:46    Titel: Antworten mit Zitat

Wobei brauchst du Hilfe? Sieht doch schon ganz gut aus. lächeln
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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 14.08.2009, 09:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Löwenherz



Anmeldungsdatum: 25.08.2008
Beiträge: 86
Wohnort: auf einer sonnigen Insel :)

BeitragVerfasst am: 14.08.2009, 14:30    Titel: Antworten mit Zitat

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 lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz