GDI, Kreismittelpunkt & Radius - Frage

  • Hiho!

    Ich hab da mal 'ne kleine Frage. Kurz gesagt, ich suche den Mittelpunkt ein Kreises ... :wacko:

    Situation:
    Ich habe ein Bild (weißer Hintergrund mit schwarzem, gefülltem Kreis (eine Seite ist leider abgeflacht) ).
    Per _GDIPlus_BitmapGetPixel() suche ich von allen 4 Bildseiten nach innen eine Pixeländerung und erhalte als Rückgabe 4 Arrays mit X- & Y-Werten.

    Aufgabenstellung:
    Aus meiner Schulzeit erinner' ich mich noch dunkel (ok und ich hab Onkel google gefragt :rolleyes: ), dass ich den Mittelpunkt des Kreises über 3 Randpunkte des Kreises (ein Dreieck) und dem Schnittpunkt der Mittelsenkrechten des Dreiecks rausfinden kann.

    Frage:

    • Gibt es eine Funktion, die ich mit 3 X|Y - Werten fütter und dem Mittelpunkt erhalte?
    • Oder würdet ihr das eher "per GDI" angehen, indem ihr 3 Randpunkte verbindet, die Geraden halbiert und den Schnittpunkt der Orthogonalen durch den ... Dingens (Mathe war noch nie mein Freund ^^ ) ... na ihr wisst schon ... ermittelt.


      Ich hänge grad irgendwie in der Luft, wie ich diese Fragestellung anzugehen hab. Über ein paar Schubser in die richtige Richtung würde ich mich freuen.

      Gruß Fred

    Einmal editiert, zuletzt von fredowsky (26. September 2012 um 19:00)

  • Mal ne Frage: Ist es wirklich wichtig, dass genau von diesem Bild der Mittelpunkt gesucht wird, oder von Kreisen allgemein?

    Spoiler anzeigen


    >> Der "Kreis" ist nicht wirklich zu 100% Rundlich. Zudem müsste man eine art *Filter* einbauen, der diese "abgesägte" Seite erkennt und nach möglichkeit umgeht. Ich versuche mal ein Verfahren nachzbauen der genau so vorgeht, als würde man auf ein Blatt Papier arbeiten x)


    >> Wie man das ganze *errechnen* kann, wüsste ich jetzt nicht... Aber mal schaun ob da überhaupt was rauskommt x)

  • Es geht um Kreise (Kreise mit ner abgeschnittenen Kante) allgemein. Das Bild is jetzt nur um zum testen. Später ist das eine Aufnahme einer Kamera ...

    Naja, wenns denn jemals mal so weit kommt :rolleyes:

    Im Moment versuch ich mich an der allgemeinen Kreisgleichung:
    (x-xm)² + (y-ym)² = r²

    YAY! :rofl:

  • Nicht ganz, da der "obere Strich" ja nicht die tatsächliche Kante des Kreises findet und somit es nicht der Mittelpunkt des Kreises ist.
    (Ich bin mir nicht ganz sicher, dass ich verständlich geschrieben hab, was ich meine)

    Falls nicht, frag einfach ;)

  • Ich habe folgendes rausgelesen:

    Du machst Bilder (mit deiner Kamera) und auf diesen Bildern sind die (abgeschnittenden) Kreise.

    "Per _GDIPlus_BitmapGetPixel() suche ich von allen 4 Bildseiten nach innen eine Pixeländerung und erhalte als Rückgabe 4 Arrays mit X- & Y-Werten."


    Ich bin davon ausgegenagen, dass dies die 4 Seiten sind, wo der Kreis aufhört?
    >> Wenn das der Fall ist, wäre es denkbar einfach anhand der gewonnenen Daten den Mittelpunkt zu bestimmen ^^


    Edit: Ahh, jetzt weiß ich was du meinst... Man müsste den Kreis erst "vervollständigen" damit man weiß wo die obere Seite ist :/
    >> Denkfehler x) |

  • Ein Kreis aus 3 Punkten ist der Umkreis eines Dreieckes (>>Ansatz<<).

    Da es sich hier aber um Bildverarbeitung handelt schreit die Aufgabenstellung geradezu nach einer Hough-Transformation.
    Da es fachlich und programmiertechnisch (erst Recht in AutoIt) doch zu anspruchsvoll ist soll es hier lediglich eine Erwähnung finden um mal zu zeigen wie man robust Kreise oder andere geometrische Primitiven in einem Bild detektieren kann.

    Eine weitere Methode das robust umzusetzen (wenn man es entsprechend umsetzt) wäre der Ellipsenoperator (z.b. >>hier<< beschrieben)

  • Den Ansatz über die Kreisgleichung hatte ich ja oben schon erwähnt, aber mein eingerostetes Mathe reicht da wohl nicht aus.

    Aber Hough-Transformation klingt interessant, auch wenns sich in AutoIt vielleicht nicht stemmen lässt.

    Ich komm bei dem Beispiel, an dem ich mich grade versuche: (4-xm)² + (1-ym)²
    nicht auf: 4 +4xm + xm² + 9 - 6ym + ym²
    sondern: 16 - 8xm + xm² + 1 - 2xm + xm²
    ... aber da komm ich schon irgendwann dahinter ^^

  • Welche ich allerdings nicht erwähnt habe.
    Ich habe dir den Ansatz über den Umkreis eines Dreieckes verlinkt deren Berechnung auch ohne die Lösung eines Gleichungssystems auskommt.

    Stimmt. Aber ich brauch dann doch Seitenlängen und Winkel des Dreiecks. Leichter wirds dadurch aber nicht (finde ich).

  • Dank dir ytwinky!

    Ich hab mir zuerst Gedanken über das Gleichungssystem in dem Link von dir gemacht, aber sowas in AutoIt ... uihuihuih
    Den FreeBasic-Code schau ich mir morgen. Danke auch dafür. Über das Portieren ... lassen wir das lieber ;)

    Momentan verfolge ich AspirinJunkies Vorschlag:
    Anscheinend ist es ja garnicht so schwer eine Strecke anhand von 2 gegebenen Punkten auszurechnen. Und 'Atan2" werd ich schon ausgraben ^^

  • Hab überlesen das du nicht nur den Radius möchtest sondern auch die Koordinaten des Mittelpunktes.
    Die sind auf dem streng geometrischen Wege etwas schwieriger zu erhalten.
    Wenn du nicht davor zurückschreckst Gleichungssysteme zu lösen wirst du mit der Lösung von ytwinky ganz gut fahren.

    Ansonsten hier noch der geometrische Weg:

    Umkreis eines Dreieckes
    [autoit]

    Global Const $PI = ACos(-1)

    [/autoit] [autoit][/autoit] [autoit]

    ; 3 Punkte des Dreieckes
    Global $P_A[2] = [0.8, 1]
    Global $P_B[2] = [1.2, 2.5]
    Global $P_C[3] = [2.2, 2.3]

    [/autoit] [autoit][/autoit] [autoit]

    ; Strecken
    Global $s_A = s_2D($P_B, $P_C)
    Global $s_B = s_2D($P_A, $P_C)
    Global $s_C = s_2D($P_B, $P_A)

    [/autoit] [autoit][/autoit] [autoit]

    ;Winkel
    Global $alpha = w_2D($P_A, $P_B, $P_C)
    Global $beta = w_2D($P_B, $P_A, $P_C)
    Global $gamma = w_2D($P_C, $P_B, $P_A)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(StringFormat("\nStrecken:\n\ta:\t%5.2f\n\tb:\t%5.2f\n\tc:\t%5.2f\n\nWinkel:\n\talpha:\t%5.2f°\n\tbeta:\t%5.2f°\n\tgamma:\t%5.2f°\n\n", $s_A, $s_B, $s_C, $alpha * 180 / $PI, $beta * 180 / $PI, $gamma * 180 / $PI))

    [/autoit] [autoit][/autoit] [autoit]

    ; Radius des Umkreises:
    Global $r_Umkreis = $s_A / (2 * Sin($alpha))
    ConsoleWrite(StringFormat("Umkreisparameter:\n\tr:\t%5.2f\n", $r_Umkreis))

    [/autoit] [autoit][/autoit] [autoit]

    ; Koordinaten des Umkreismittelpunktes:
    Global $M = MitteUmkreis($P_A, $P_B, $P_C, $alpha, $beta, $gamma)
    ConsoleWrite(StringFormat("\tx_M:\t%5.2f\n\ty_M:\t%5.2f\n\n", $M[0], $M[1]))

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Bestimmt den Mittelpunkt eines Umkreises aus den 3 Eckkordinaten und den Dreieckswinkeln
    Func MitteUmkreis($A, $B, $C, $alpha, $beta, $gamma)
    Local $M_bary[3] = [Sin(2 * $alpha), Sin(2 * $beta), Sin(2 * $gamma)] ; baryzentrische Koordinaten des Mittelpunktes

    [/autoit] [autoit][/autoit] [autoit]

    Local $M_kart[2] = [($M_bary[0] * $A[0] + $M_bary[1] * $B[0] + $M_bary[2] * $C[0]) / ($M_bary[0] + $M_bary[1] + $M_bary[2]), _
    ($M_bary[0] * $A[1] + $M_bary[1] * $B[1] + $M_bary[2] * $C[1]) / ($M_bary[0] + $M_bary[1] + $M_bary[2])]
    Return $M_kart
    EndFunc ;==>MitteUmkreis

    [/autoit] [autoit][/autoit] [autoit]

    ; Abstand 2er 2D-Punkte (Punkte als Array übergeben)
    Func s_2D($P1, $P2)
    Local $dX = $P1[0] - $P2[0]
    Local $dY = $P1[1] - $P2[1]

    [/autoit] [autoit][/autoit] [autoit]

    Return (Sqrt($dX * $dX + $dY * $dY))
    EndFunc ;==>s_2D

    [/autoit] [autoit][/autoit] [autoit]

    ; Winkel (in radiant) zwischen drei 2D-Punkten (Punkte als Array übergeben)
    Func w_2D($SP, $Z1, $Z2)
    Local Const $A[2] = [$Z1[0] - $SP[0], $Z1[1] - $SP[1]]
    Local Const $B[2] = [$Z2[0] - $SP[0], $Z2[1] - $SP[1]]

    [/autoit] [autoit][/autoit] [autoit]

    Local $Spat = $A[0] * $B[0] + $A[1] * $B[1]
    Local $b_A = Sqrt($A[0] * $A[0] + $A[1] * $A[1])
    Local $b_B = Sqrt($B[0] * $B[0] + $B[1] * $B[1])

    [/autoit] [autoit][/autoit] [autoit]

    Return ACos($Spat / ($b_A * $b_B))
    EndFunc ;==>w_2D

    [/autoit]
  • AspirinJunkie: Tausend Dank!
    Ob ich die Lösung nun mathematisch oder geometrisch bestimme ist doch im Grunde egal. (Oder nicht?)
    Und eigentlich ging es mir hauptsächlich um den Mittelpunkt! (Mit dem Mittelpunkt kann ich ein Quadrat um den 'Kreis' zeichnen/ihn um den Mittelpunkt drehen und so die 'abgeschnittene' Seite finden, etc)
    Und ja, ich schrecke sehr wohl davor zurück Gleichungssysteme zu lösen. Da hatte ich schon in der Schulzeit meine Probleme. Für ein Skript wie deine geometrische Lösung hätte ich trotzdem sicher Tage geknobelt ... :S

    ytwinky: In einem Post von 2006 von dir hatte ich etwas über Atan2 (hatte AspirinJunkie geschrieben, dass ich diese Funktion benötige) gefunden. Und nochmals danke für deinen FreeBasic-Code. Ich behalt diese Lösung mal im Hinterkopf, vielleicht versuch ich mich ja doch demnächst an einer Portierung.

    Und für alle anderen: AspirinJunkies Lösung ist eigentlich genau das, was ich gehofft hatte zu finden. Ich setz den Thread mal auf gelöst aber falls jemand Fragen oder Anregungen hat, immer her damit ;)

    Gruß Fred

  • Hi,

    Zitat

    Und eigentlich ging es mir hauptsächlich um den Mittelpunkt! (Mit dem Mittelpunkt kann ich ein Quadrat um den 'Kreis' zeichnen/ihn um den Mittelpunkt drehen und so die 'abgeschnittene' Seite finden, etc)

    imho der völlig falsche Ansatz! Du suchst einen (teilweisen) Kreis, um dann durch weiteres Suchen die "abgeschnittene" Seite (Sekante) zu finden...wieso suchst du nicht die Linie=Sekante direkt?

    Ich hatte die "Kreissuche" in einem meiner Scripte verwendet, um Augen auf Bildern von Gesichtern zu detektieren.
    Dazu habe ich zunächst per Sobel-Operator die Kanten im Bild gesucht und dann mittels eines "handgeschnitzen" kurzen, aber dafür langsamen AutoIt-Algorithmus (in Assembler gings dann schneller^^) die "Kreise" im (Schwarzweiss-) Bild gesucht.
    Der Algorithmus war sehr einfach (Bruteforce FTW :rock: )
    Nimm ein Pixel M einer Bitmap und schlage einen Kreis mit Radius r und Linienbreite b.
    Prüfe nacheinander die Pixel auf dem Kreis auf "weiß", wenn weiß, dann x=x+1
    Durch den Radius r und die Linienbreite b ist die maximale Anzahl y der möglichen weißen Pixel auf dem Kreis bekannt.
    Wenn x~y, dann ist fast jedes Pixel auf dem Kreis weiß, ergo ist M der Mittelpunkt eines Kreises auf der Bitmap^^
    Aber auch wenn die Anzahl der "gesetzten" Pixel auf dem Kreis nur 70-80% betragen, lohnt sich eine nähere Betrachtung...

    Kreise suchen ist SEHR aufwendig, Linien suchen SEHR schnell und einfach (y=mx+b)
    Also such doch die Linie im Bild, eine senkrechte auf der Mitte dieser Sekante geht durch den Mittelpunkt des Kreises und gibt dir im Verlauf beim Farbwechsel (weiss/schwarz) den 3. Punkt auf deinem Kreisbogen.


    //Edit//

    [autoit]

    Func atan2($y, $x)
    Return (2 * ATan($y / ($x + Sqrt($x * $x + $y * $y))))
    EndFunc ;==>atan2

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (26. September 2012 um 20:03)

  • .. Ich behalt diese Lösung mal im Hinterkopf, vielleicht versuch ich mich ja doch demnächst an einer Portierung..

    Für den Fall, daß du eine 'Gehhilfe' für die Portierung benötigst, habe ich mein FreeBasic-Programm 'mal eben' nach AutoIt überführt.
    Es ist aber nur eine Rohfassung, deren Kernpunkt die Func K3Pa () ist, die als Rückgabewert den Radius liefert, wenn möglich:

    Spoiler anzeigen
    [autoit]

    ;<AutoItScript>
    #NoTrayIcon ;ohne SysTray-Icon, hängende Prozesse mit TaskMan beenden
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    Opt('MustDeclareVars', 0) ;0=ohne, 1=erfordert Variablen-Deklaration
    ;+----------------------------------------------------------------+
    ;| AnzeigeCheck: |Il1 sind Alt-0124, GROßES i, kleines L, Eins |
    ;| Sonderzeichen: „ä”öüáߎę֚Üñ±ø°¸© |
    ;| Header: Bestimmung der Parameter (alle sind Strings!!!) |
    Const $Author='k3p.au3 ©2012 by ytwinky, MD'; |
    ;| EMail: [email='PIII1kSystem-AutoIt3Forum@yahoo.de'][/email] |
    ;| AutoIt3-Version: 3.3.8.1, Beta: 3.3.9.4 |
    ;| Editor: SciTE 3.2.0d, fixed font |
    ;| Zweck : Kreisberechnung durch 3 Punkte |
    ;| setze Tab auf 2 für Lesbarkeit |
    ;+----------------------------------------------------------------+
    Global $Pkt[4][3], $s=0
    #Region ### START Koda GUI section ### Form=D:\Sprachen\AutoIt3\Au3\kxf\K3P.kxf
    $K3P=GUICreate('K3P', 496, 328, 252, 122)
    $grpMain=GUICtrlCreateGroup('', 0, -6, 495, 333)
    GUICtrlCreateLabel('Kreis durch 3 Punkte', 4, 6, 244, 33)
    GUICtrlSetFont(-1, 18, 800, 0, 'Arial')
    GUICtrlSetColor(-1, 0x000080)
    GUICtrlSetTip(-1, $Author)
    $grpEingabe=GUICtrlCreateGroup('Eingabe', 4, 36, 487, 157)
    $grpLinks=GUICtrlCreateGroup('linker Punkt', 7, 101, 157, 87)
    GUICtrlCreateLabel('Bezeichnung', 12, 121, 66, 17)
    $ezPNr1=GUICtrlCreateInput('P1', 78, 118, 81, 21)
    GUICtrlCreateLabel('Rechtwert', 11, 143, 53, 17)
    $ezyp1=GUICtrlCreateInput('0.9080732', 78, 141, 81, 21)
    GUICtrlCreateLabel('Hochwert', 11, 166, 50, 17)
    $ezxp1=GUICtrlCreateInput('4.0642982', 78, 163, 81, 21)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $grpMitte=GUICtrlCreateGroup('mittlerer Punkt', 169, 48, 157, 87)
    GUICtrlCreateLabel('Bezeichnung', 174, 68, 66, 17)
    $ezPNr2=GUICtrlCreateInput('P2', 240, 65, 81, 21)
    GUICtrlCreateLabel('Rechtwert', 173, 91, 53, 17)
    $ezyp2=GUICtrlCreateInput('2.8485684', 240, 88, 81, 21)
    GUICtrlCreateLabel('Hochwert', 173, 113, 50, 17)
    $ezxp2=GUICtrlCreateInput('1.6679862', 240, 110, 81, 21)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $Group4=GUICtrlCreateGroup('rechter Punkt', 331, 101, 157, 87)
    GUICtrlCreateLabel('Bezeichnung', 336, 121, 66, 17)
    $ezPNr3=GUICtrlCreateInput('P3', 402, 118, 81, 21)
    GUICtrlCreateLabel('Rechtwert', 335, 144, 53, 17)
    $ezyp3=GUICtrlCreateInput('0.4589868', 402, 141, 81, 21)
    GUICtrlCreateLabel('Hochwert', 335, 166, 50, 17)
    $ezxp3=GUICtrlCreateInput('4.0996421', 402, 163, 81, 21)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $btnBerechnen=GUICtrlCreateButton('Berechnen', 210, 154, 75, 25)
    GUICtrlSetFont(-1, 8, 800, 0, 'MS Sans Serif')
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $Berechnung=GUICtrlCreateGroup('Berechnung', 4, 194, 487, 129)
    $grpBerechnung=GUICtrlCreateGroup('Zentrum', 9, 211, 157, 107)
    GUICtrlCreateLabel('Rechtwert', 13, 230, 53, 17)
    $ezyZ=GUICtrlCreateInput('ezyZ', 66, 227, 81, 21)
    GUICtrlCreateLabel('Hochwert', 13, 252, 50, 17)
    $ezxZ=GUICtrlCreateInput('ezxZ', 66, 249, 81, 21)
    GUICtrlCreateLabel('Radius', 15, 296, 37, 17)
    $ezRadius=GUICtrlCreateInput('Radius', 66, 293, 81, 21)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $grpKontrolle=GUICtrlCreateGroup('Konrollrechnung', 168, 211, 319, 107)
    GUICtrlCreateLabel('Strecke vom Zentrum zum', 172, 229, 128, 17)
    GUICtrlCreateLabel('Differenz', 390, 229, 46, 17)
    GUICtrlCreateLabel('linken Punkt', 230, 250, 63, 17)
    $ezR1=GUICtrlCreateInput('ezR1', 307, 247, 81, 21)
    $ezK1=GUICtrlCreateInput('ezK1', 390, 247, 81, 21)
    GUICtrlCreateLabel('mittleren Punkt', 230, 272, 74, 17)
    $ezR2=GUICtrlCreateInput('ezR2', 307, 269, 81, 21)
    $ezK2=GUICtrlCreateInput('ezK2', 390, 269, 81, 21)
    GUICtrlCreateLabel('rechten Punkt', 231, 294, 71, 17)
    $ezR3=GUICtrlCreateInput('ezR3', 307, 291, 81, 21)
    $ezK3=GUICtrlCreateInput('ezK3', 390, 291, 81, 21)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnBerechnen
    $Pkt[1][0]=GUICtrlRead($ezPNr1)
    $Pkt[1][1]=GUICtrlRead($ezyp1)
    $Pkt[1][2]=GUICtrlRead($ezxp1)
    $Pkt[2][0]=GUICtrlRead($ezPNr2)
    $Pkt[2][1]=GUICtrlRead($ezyp2)
    $Pkt[2][2]=GUICtrlRead($ezxp2)
    $Pkt[3][0]=GUICtrlRead($ezPNr3)
    $Pkt[3][1]=GUICtrlRead($ezyp3)
    $Pkt[3][2]=GUICtrlRead($ezxp3)
    GUICtrlSetData($ezRadius, StringFormat('%3.11f', K3Pa()))
    GUICtrlSetData($ezyZ, StringFormat('%3.11f', $Pkt[0][1]))
    GUICtrlSetData($ezxZ, StringFormat('%3.11f', $Pkt[0][2]))
    GUICtrlSetData($ezR1, StringFormat('%3.11f', Strecke(0, 1)))
    GUICtrlSetData($ezR2, StringFormat('%3.11f', Strecke(0, 2)))
    GUICtrlSetData($ezR3, StringFormat('%3.11f', Strecke(0, 3)))
    GUICtrlSetData($ezK1, StringFormat('%3.3e', Strecke(0, 1)-GUICtrlRead($ezRadius)))
    GUICtrlSetData($ezK2, StringFormat('%3.3e', Strecke(0, 2)-GUICtrlRead($ezRadius)))
    GUICtrlSetData($ezK3, StringFormat('%3.3e', Strecke(0, 3)-GUICtrlRead($ezRadius)))
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;<AutoItFunctions>
    Func Strecke($PA, $PE)
    Return Sqrt(($Pkt[$PA][1]-$Pkt[$PE][1])^2+($Pkt[$PA][2]-$Pkt[$PE][2])^2)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Mittel($a, $b)
    Return ($a+$b)/2.0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func K3Pa()
    Local $y1s, $x1s, $y2s, $x2s, $m1=0, $m2=0, $i
    ;Koordinaten von P1'
    $y1s=Mittel($Pkt[1][1], $Pkt[2][1])
    $x1s=Mittel($Pkt[1][2], $Pkt[2][2])
    ;Koordinaten von P2'
    $y2s=Mittel($Pkt[2][1], $Pkt[3][1])
    $x2s=Mittel($Pkt[2][2], $Pkt[3][2])
    ;Steigungen berechnen
    $dx21=$Pkt[2][2]-$Pkt[1][2]
    $dx32=$Pkt[3][2]-$Pkt[2][2]
    $m1=($Pkt[2][1]-$Pkt[1][1])/$dx21
    $m2=($Pkt[3][1]-$Pkt[2][1])/$dx32
    ;1. Lösung, falls weder x2-x1=0 noch x3-x2=0 ist:
    If $dx21*$dx32<>0 Then ;also sind beide<>0 !!
    $xm1=$x1s+$m1*($m2*($y1s-$y2s)+($x1s-$x2s))/($m2-$m1)
    $ym1=$y1s-($xm1-$x1s)/$m1
    ;Kontrolle:
    $xm2=$x2s+$m2*($m1*($y1s-$y2s)+($x1s-$x2s))/($m2-$m1)
    $ym2=$y2s-($xm2-$x2s)/$m2
    $Pkt[0][1]=Mittel($ym1, $ym2)
    $Pkt[0][2]=Mittel($xm1, $xm2)
    ElseIf $dx21=0 Then ;2. Lösung, falls x2-x1=0 ist:
    $Pkt[0][2]=$x2s-$m2*($y1s-$y2s)
    $Pkt[0][1]=$y1s
    ElseIf $dx32=0 Then ;3. Lösung, falls, x3-x2=0 ist:
    $Pkt[0][2]=$x1s-$m1*($y2s-$y1s)
    $Pkt[0][1]=$y2s
    Else
    $Pkt[0][1]='n.v.'
    $Pkt[0][2]='n.v.'
    $Pkt[0][0]='Keine Lösung'
    Return 0
    EndIf
    $m1=0.0
    $m2=0.0
    For $i=1 To 3
    $y1s=Abs($Pkt[0][1]-$Pkt[$i][1])*Abs($Pkt[0][2]-$Pkt[$i][2])
    $m1+=$y1s
    $m2+=Strecke(0, $i)*$y1s
    Next
    $Pkt[0][0]='Zentrum'
    Return $m2/$m1 ;Radius zurückgeben..
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;</AutoItScript>

    [/autoit]


    Hth..
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

  • Fred: Ich bin auch grad dabei ein Kameraprogramm zuschreiben, für unsere Kameras auf der Arbeit. Ich nutze dabei die freie Bibliothek OpenCV. Dort gibt es die Funktion HoughCircles, welche nach der genannten Transformation arbeitet. Bin noch dabei die Funktion nach AutoIt zu portieren. Aber das dauert noch nen bisschen. Wenn du es jetzt unbedingt benötigst, solltest du vielleicht in C++ oder Python das ganze schreiben. Dort ist es schon lange lauffähig.