Wir schätzen Ihren Input! Bitte nehmen Sie an der Umfrage zu Archicad 28 Startbildschirm und Lerninhalte/Schnell-Tutorials teil
am 2013-02-03 08:54 PM
line2 x11, y11, x12, y12
line2 x21, y21, x22, y22
am 2013-02-03 09:51 PM
am 2013-02-03 10:30 PM
am 2013-02-04 08:34 AM
am 2013-02-04 09:07 AM
am 2013-02-04 10:15 AM
am 2013-02-04 06:20 PM
am 2013-02-05 10:04 PM
uid = 1
eps = 0.0001
gosub "Polygonhotspots"
gosub "Linienzug"
end
"Polygonhotspots": !!! ========== hotspots ==========
for k = 1 to nSeg+1
!!! ----- X -----
hotspot2 0 , y[k], uid, x[k], 1+128 : uid = uid+1 ! centre
hotspot2 -1 , y[k], uid, x[k], 3 : uid = uid+1 ! ref
hotspot2 x[k], y[k], uid, x[k], 2 : uid = uid+1 ! moving
!!! ----- Y -----
hotspot2 x[k], 0 , uid, y[k], 1+128 : uid = uid+1 ! centre
hotspot2 x[k], -1 , uid, y[k], 3 : uid = uid+1 ! ref
hotspot2 x[k], y[k], uid, y[k], 2 : uid = uid+1 ! moving
next k
return
"Linienzug": !!! mal Führungslinie ohne Winkeldrehungen oder Koordinatenverschiebungen
for k = 1 to nSeg
line2 x[k],y[k], x[k+1],y[k+1] !! Nur reiner Linienzug
gosub "Parallele1"
gosub "Parallele2"
gosub "Schnittpunkte1"
gosub "Parallele Linien zeichnen"
next k
return !!!!Ende Führungslinie
"Parallele1":
x1=x[k] !!!Koordinaten im Segment rauspicken
x2=x[k+1]
y1=y[k]
y2=y[k+1]
dx = x2 - x1 !!!x+y Distanz der Punkte des Segmentes
dy = y2 - y1
if dx < 0 then dx = -dx
if dx = 0 then dx=eps
if dx < eps and dx < -eps then
Winkelsegment = 90
else
WinkelSegment = atn(dy/dx)
endif
RewinSeg = WinkelSegment - 90
Diagonale1 = sqr (dx^2+dy^2) !!!!Distanz der Punkte des Segmentes
P1x1 = -breite * cos(RewinSeg)+x1
P1y1 = -breite * sin(RewinSeg)+y1
p1x2 = -breite * cos(RewinSeg)+x2
p1y2 = -breite * sin(RewinSeg)+y2
if x2 < x1 then
P1y1 = breite * sin(RewinSeg)+y1
p1y2 = breite * sin(RewinSeg)+y2
else
endif
!line2 p1x1, p1y1, p1x2, p1y2
return
"Parallele2":
x11=x[k+1] !!!Koordinaten im Segment rauspicken
x21=x[k+2]
y11=y[k+1]
y21=y[k+2]
dx1 = x21 - x11 !!!x+y Distanz der Punkte des Segmentes
dy1 = y21 - y11
if dx1 < 0 then dx1 = -dx1
if dx1 = 0 then dx1=eps
if dx1 < eps and dx1 < -eps then
Winkelsegment1 = 90
else
WinkelSegment1 = atn(dy1/dx1)
endif
RewinSeg1 = WinkelSegment1 - 90
Diagonale2 = sqr (dx1^2+dy1^2) !!!!Distanz der Punkte des Segmentes
P2x1 = -breite * cos(RewinSeg1)+x11
P2y1 = -breite * sin(RewinSeg1)+y11
p2x2 = -breite * cos(RewinSeg1)+x21
p2y2 = -breite * sin(RewinSeg1)+y21
if x21 < x11 then
P2y1 = breite * sin(RewinSeg1)+y11
p2y2 = breite * sin(RewinSeg1)+y21
else
endif
!line2 p2x1, p2y1, p2x2, p2y2
return
"Schnittpunkte1": !!!!Nicht von mir erfunden!
getValues = 1
put p1x1, p1y1, p1x2, p1y2, p2x1, p2y1, p2x2, p2y2
gosub "Schnittpunkt zweier Linien - 2D"
if not(parallelLines~5) then
spx = x~5
spy = y~5
!circle2 spx, spy, 0.1
xp[k] = spx
yp[k] = spy
else
line2 0,0,1,0
endif
return
"Schnittpunkt zweier Linien - 2D": !!!!Nicht von mir erfunden!
if getValues then
x11~5 = get(1): y11~5 = get(1)
x12~5 = get(1): y12~5 = get(1)
x21~5 = get(1): y21~5 = get(1)
x22~5 = get(1): y22~5 = get(1)
getValues = 0
endif
u1x~5 = x12~5 - x11~5
u1y~5 = y12~5 - y11~5
u2x~5 = x22~5 - x21~5
u2y~5 = y22~5 - y21~5
!Prüfung ob parallel und Punkt finden
D~5 = u2x~5*u1y~5 - u1x~5*u2y~5
if abs(D~5) < eps then
parallelLines~5 = 1
else
parallelLines~5 = 0
endif
!Schnittpunkt von nicht parallelen Linien:
if not(parallelLines~5) then
t~5 = (u1x~5*(y21~5 - y11~5) - u1y~5*(x21~5 - x11~5))/D~5
x~5 = x21~5 + t~5*u2x~5
y~5 = y21~5 + t~5*u2y~5
endif
return
"Parallele Linien zeichnen":
P1x1 = -breite * cos(RewinSeg)+x1 !!Koordinaten für die
P1y1 = -breite * sin(RewinSeg)+y1 !!Parllelen - Enden
p1x2 = -breite * cos(RewinSeg)+x2
p1y2 = -breite * sin(RewinSeg)+y2
if x2 < x1 then !!Umkehrung verhindern
P1y1 = breite * sin(RewinSeg)+y1 !!bei x2 > x1
p1y2 = breite * sin(RewinSeg)+y2
else
endif
if k = 1 then
line2 x[k],y[k], p1x1, p1y1 !!Anfangsabschlußlinie
line2 p1x1, p1y1, xp[k], yp[k] !!Dann zum nächsten Schnittpunkt
line2 xp[k], yp[k], x[k+1],y[k+1] !!Winkelhalbierende
else
if k < nSeg then
line2 xp[k], yp[k], xp[k-1], yp[k-1] !!Von Schnittpunkt zu Schnittpunkt
line2 xp[k], yp[k], x[k+1],y[k+1] !!Winkelhalbierende
else
endif
endif
if k = nSeg then
line2 xp[k-1], yp[k-1], p1x2, p1y2 !!Von Schnittpunkt zu ReWi-Punkt
line2 x2, y2, p1x2, p1y2
else
endif
endif
return
eps = 0.0001
if dx = 0 then dx=eps