{*****************************************************************************} {************** Datei Anfang ***********************************************} {*****************************************************************************} {*** Fuer Ausdruck: &r &n &d &u Seite &s **} {*** Fuer Ausdruck: &r Seite &s **} {*** Fuer Ausdruck: Fixsys 5Pt **} {Datei: :/hc_me10/hc_schnittpunkt_c_circles_v1.txt} {12:58 08.02.2013} {Haupt-Prgm} define hc_schnittpunkt_c_circles local mp1 {Mittel-Punkt1} local r1 {Radius1 } local mp2 {Mittel-Punkt2} local r2 {Radius2 } local dist {Distanz zwischen MP1 und MP2} local dist_wnk {Distanzwinkel zwischen MP1 und MP2} local d1 {Hilfsvariable zur Fallunterscheidung} local d2 {Hilfsvariable zur Fallunterscheidung} local ph {Hilfspunkt} local Z0 {Zaehler0; Anzahl der Elemente} local Z1 {Zaehler1} local Z2 {Zaehler2} local Z3 {Zaehler3} local i {Zaehler in ltab} local name_ltab {Name der Ltab} inq_selected_elem c_circles all let z0 (inq 14) {Anzahl Elemente} let z1 0 let z2 1 {Zaehler z2 auf 1; Reduktion der Punkt-Berechnungen} let z3 0 if (z0 > 1) {Berechnung nur sinnvoll, wenn min. 2 Elemente vorhanden sind.} {logische Tabelle aufsetzen} let name_ltab 'c_circles_werte' {Create logical table; n lines; 2 columns; Name der logical table} {Column 1: Mittel-Punkt; Column 2: Radius} create_ltab z0 2 name_ltab let i 0 {Elemente in Tabelle schreiben} loop exit_if ((inq 14) = 0) let i (i + 1) let mp1 (inq 101) {Mittelpunkt des Kreises} write_ltab name_ltab i 1 (str mp1) let r1 (inq 3) {Radius des Kreises} write_ltab name_ltab i 2 (str r1) let ph (mp1 + pnt_ra r1 45) change_color cyan ph end {Element wurde erfasst} inq_next_elem end_loop {Werte auslesen und Punkte berechnen} loop {1. Element} let z1 (z1 + 1) {Element n} let mp1 (VAL (read_ltab name_ltab z1 1)) let r1 (VAL (read_ltab name_ltab z1 2)) loop {2. Element} let z2 (z2 + 1) {Element n+1} let mp2 (VAL (read_ltab name_ltab z2 1)) let r2 (VAL (read_ltab name_ltab z2 2)) {dist berechnen} let dist (len (mp1 - mp2)) let d1 (dist - r1 - r2) let d2 (abs (r1 - r2) - dist) if ((d1 <= (1e-10)) and (d1 >= (-1e-10))) let d1 0 else_if ((d2 <= (1e-10)) and (d2 >= (-1e-10))) let d2 0 end_if {Fallunterscheidungen treffen} if ((mp1 <> mp2) and (d1 <= 0) and (d2 <= 0)) {Kreise ohne Schnittstellen ausschließen} let dist_wnk (ang (mp2 - mp1)) if ((d1 = 0) or (d2 = 0)) {Kreise mit 1 Beruehrungspunkt; Fall 1} hc_schnittpunkt_ber_circles mp1 r1 mp2 r2 dist dist_wnk 1 let z3 (z3 + 1) else_if ((d1 < 0) or (d2 < 0)) {Kreise mit 2 Schnittstellen; Fall 2} hc_schnittpunkt_ber_circles mp1 r1 mp2 r2 dist dist_wnk 2 let z3 (z3 + 2) end_if else display_no_wait ('Kreise ohne Schnittstellen.') end_if exit_if (z2 = z0) {letztes Element} end_loop let z2 (z1 + 1) {Element n+2} exit_if (z1 = (z0 - 1)) {vorletztes Element} end_loop else display ('Nur ' + str z0 + ' Kreis(e) ohne Schnittpunkte gefunden. Programm Ende.') end_if delete_ltab name_ltab window_fit display (str z3 +' Punkte mit ' + str z0 + ' Kreisen erzeugt.') end_define {Schnittpunktsberechnung} define hc_schnittpunkt_ber_circles parameter mp1 parameter r1 parameter mp2 parameter r2 parameter dist parameter dist_wnk parameter fall local w_r2 local pntxy1 local pntxy2 let pntxy1 (mp1 + pnt_ra r1 45) {Elemente markieren} let pntxy2 (mp2 + pnt_ra r2 45) change_color green pntxy1 pntxy2 end if (fall = 1) let pntxy1 (mp1 + (pnt_ra r1 dist_wnk)) point pntxy1 end else_if (fall = 2) let w_r2 (arccos((r1^2 + dist^2 - r2^2)/(2 * r1 * dist))) {Cosinussatz} let pntxy1 (mp1 + (pnt_ra r1 (dist_wnk + w_r2))) let pntxy2 (mp1 + (pnt_ra r1 (dist_wnk - w_r2))) point pntxy1 pntxy2 end end_if end_define