Liste der Anhänge anzeigen (Anzahl: 1)
Schnittpunkt dreier Kugeln berechnen
Hallo,
ich versuche mich seit geraumer Zeit an der Berechnung des Schnittpunktes dreier Kreise. Ich habe eine sehr gute Dokumentation gefunden. Nur leider ist mir der Rechenweg zu komplex. Hier werden die Ausgangsgleichungen mit der funktion SOLVE gelöst. Diese funktion gibt es meineswissens aber in BASCOM nicht.
Gegeben sind die Positionen der Punkte S1, S2, S3 und deren Abstände (Radien) zum Punkt P1. (alle Winkel innerhalb der Dreiecks-Pyramide kann ich auch berechnen)
Gesucht sind die Koordinaten zum Punkt P1.
Anhang 29917
Ich versuche zu einer Formel zu kommen bei der ich meine Eingangsdaten verwenden kann.
Ich hatte gehofft über dreiecksberechnung innerhalb der unregelmäßigen Dreieckspyramide ans Ziel zu kommen.
Evtl. hat jemand für mich eine Formle/Lösungsweg/Tipp der sich auch in BASCOM umsetzen lässt.
vielen Dank
mfG
Mario
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
und vielen Dank für Eure Antworten.
Da ich nicht gerade das riesige Mathegenie bin habe ich es doch mit einer automtischen Suche gemacht.
Begrenzt durch maximale Suchdurchgänge und dem Abgleich der Abweichung der berechneten Radien von den Zielradien lassen sich auch ganz gut Falsche Eingangswerte erkennen. Die Zeit ist durch eine dynamische Schrittanpassung auch nicht so lang wie ich dachte.
Habe mein Excel Testprgramm und den Code mal angehangen.
Vielen Dank für Eure hilfe.
Code:
Option Explicit
Dim P(5) As Double
Dim S1(5) As Double
Dim S2(5) As Double
Dim S3(5) As Double
Sub GetGPSPos()
Dim iStepCount As Integer
Dim iStepLimit As Integer
Dim iStep As Integer
Dim i As Integer
Dim dError As Double
Dim dTolerance As Double
Dim Mybook As Workbook
Dim MySheet As Worksheet
Dim StartTime As Date
Dim EndTime As Date
'Zeitmessung
StartTime = Timer
'Excelwerte holen
Set Mybook = ActiveWorkbook
Set MySheet = Mybook.ActiveSheet
For i = 0 To 3
S1(i) = MySheet.Cells(2, i + 2)
S2(i) = MySheet.Cells(3, i + 2)
S3(i) = MySheet.Cells(4, i + 2)
P(i) = 0
Next
'Grenzen festlegen
dTolerance = 1 'benötigte Toleranz
iStepCount = 0 'Durchlaufzähler rücksetzen
iStepLimit = 1000 'Durchlaufgrenze festlegen
Do
'Durchlaeufe zählen
iStepCount = iStepCount + 1
'Gesamtabweichung berechnen
dError = GetError
'Schritt festlegen
iStep = Fix(dError / 3)
If iStep = 0 Then
iStep = 1
End If
'X-Check
P(0) = P(0) + iStep
If GetError > dError Then
P(0) = P(0) - (2 * iStep)
If GetError > dError Then
P(0) = P(0) + iStep
End If
End If
'Y-Check
P(1) = P(1) + iStep
If GetError > dError Then
P(1) = P(1) - (2 * iStep)
If GetError > dError Then
P(1) = P(1) + iStep
End If
End If
'Z-Check
P(2) = P(2) + iStep
If GetError > dError Then
P(2) = P(2) - (2 * iStep)
If GetError > dError Then
P(2) = P(2) + iStep
End If
End If
'Ergebnis prüfen
If dError < dTolerance Or iStepCount >= iStepLimit Then
'Zeitmessung ende
EndTime = Timer
'Werte Ausgeben
MySheet.Cells(5, 2) = P(0)
MySheet.Cells(5, 3) = P(1)
MySheet.Cells(5, 4) = P(2)
MySheet.Cells(5, 6) = dError
MySheet.Cells(5, 7) = iStep
MySheet.Cells(5, 8) = iStepCount
MySheet.Cells(5, 9) = Format(EndTime - StartTime, "0.0")
'Schleife beenden
Exit Do
End If
Loop
End Sub
'Distanz berechnen
Function GetR(P1() As Double, P2() As Double) As Double
GetR = Sqr(((P1(0) - P2(0))) ^ 2 + ((P1(1) - P2(1))) ^ 2 + ((P1(2) - P2(2))) ^ 2)
End Function
Function GetError() As Double
'Distanz berechnen
S1(4) = GetR(S1, P)
S2(4) = GetR(S2, P)
S3(4) = GetR(S3, P)
'Abweichung berechnen
S1(5) = S1(4) - S1(3)
S2(5) = S2(4) - S2(3)
S3(5) = S3(4) - S3(3)
'Gesamtabweichung berechnen
GetError = Abs(S1(5)) + Abs(S2(5)) + Abs(S3(5))
End Function
Anhang 29932