Code: Select all
' SQRND.BSC
'SQRND.BSC AND SQUARE1.BSC ARE THE SAME
INPUT "HOW MANY SEGMENTS...?" S
INPUT "DIAMETER" D
INPUT "OFFSET R/L + IF RIGHT" ORL
INPUT "OFFSET F/B + IF BACK" OFB
INPUT "TURN ANGLE OF TOP + IF CCW: " ATU
INPUT "LENGTH" L
INPUT "WIDTH" W
INPUT "HEIGHT" H
R = D / 2
C = 3.1416*D
STP = 360/S
XP1 = L / 2
XP2 = XP1
XP3 = 0
YP1 = 0
YP2 = W / 2
YP3 = YP2
'**************************FIRST SIDE
'************************ADDED
ENT = 0
XS1 = COS(0)* R
DXS1 = COS(ATU) * XS1
NXS1 = DXS1 + ORL
Z = H
DZ = SIN(ATU) * XS1
NZ = Z + DZ
YS1 = (SIN(0) * R) + OFB
LS1 = SQRT(ABS(NXS1 - XP1) ^ 2 + ABS(YS1 - YP1) ^ 2 + ABS(NZ) ^ 2)
>LINE
{
<POINTXYZ 20,0,0
<POINTXYZ [(20+YP2),0,0]
}
LINE1 = SQRT(ABS(NXS1 - XP2) ^ 2 + ABS(YS1 - YP2) ^ 2 + ABS(NZ) ^ 2)
ANG1 = ACOS((ABS(LINE1) ^ 2 + ABS(YP2) ^ 2 - ABS(LS1) ^ 2 )/(2*LINE1*YP2))
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LINE1, ANG1, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL QX1 QY1 QZ1 1 'FIRST POINTVAL ALSO VERTEX
POINTVAL QX2 QY2 QZ2 2
>LINE
{
<POINTXYZ [(YP2+20),0,0]
<POINTXYZ [QX2, QY2, QZ2]
}
'FIRST QUAD *****************************
'J = 1
TANG = 0
CHORD = D * SIN(STP/2)
' CHORD = D * SIN(STP/2)
FOR DEG = 0 TO 90 STEP STP
'DEG = DEG + STP
X1 = COS(DEG)* R
DX1 = COS(ATU) * X1
NX1 = DX1 + ORL
Z = H
DZ = SIN(ATU) * X1
NZ = Z + DZ
Y1 = (SIN(DEG)* R) + OFB
X11 = COS(DEG + STP)* R
DX11 = COS(ATU) * X11
NX11 = DX11 + ORL
Z1 = H
DZ1 = SIN(ATU) * X11
NZ1 = Z1 + DZ1
Y11 = (SIN(DEG + STP)* R) + OFB
IF (DEG + STP) > 90 THEN EXIT FOR
L1 = SQRT(ABS(NX1 - XP2) ^ 2 + ABS(Y1 - YP2) ^ 2 + ABS(NZ) ^ 2)
L11 = SQRT(ABS(NX11 - XP2) ^ 2 + ABS(Y11 - YP2) ^ 2 + ABS(NZ1) ^ 2)
ANGQ1 = ACOS((ABS(L11) ^ 2 + ABS(L1) ^ 2 - ABS(CHORD) ^ 2 )/(2*L11*L1))
TANG = TANG + ANGQ1
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [L11, (ANG1 + TANG), 0]
}
NEXT
'************ FIRST BACK TRIANGLE **********************************
LFB = L11
LANG = ANG1+TANG
XS2 = COS(90)* R
DXS2 = COS(ATU) * XS2
NXS2 = DXS2 + ORL
Z = H
DZ = SIN(ATU) * XS2
NZ = Z + DZ
YS2 = (SIN(90) * R) + OFB
LS2 = SQRT(ABS(NXS2 - XP3) ^ 2 + ABS(YS2 - YP3) ^ 2 + ABS(NZ) ^ 2)
ANGFB = ACOS((ABS(XP1) ^ 2 + ABS(LFB) ^ 2 - ABS(LS2) ^ 2 )/(2*XP1*LFB))
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LFB, LANG, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX1 BY1 BZ1 2
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [XP1, (LANG + ANGFB), 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX3 BY3 BZ3 2
>LINE
{
<POINTXYZ [BX1,BY1,BZ1]
<POINTXYZ [BX3,BY3,BZ3]
}
'********** SECOND QUAD *****************
'XP4=-L/2,'YP4=YP3,'XP5=XP4,'YP5=0
>LINE
{
<POINTXYZ [BX3,BY3,BZ3]
<POINTPOLAR [XP1, (LANG + ANGFB) , 0]
<POINTXYZ [BX1,BY1,BZ1]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL CX2 CY2 CZ2 2
LNL = SQRT(ABS(BX1-CX2)^2 + ABS(BY1-CY2)^2)
XPLR = BX1 - CX2
YPLR = BY1 - CY2
GOSUB CHOICE
'IF ANG4 < 0 THEN ANG4 = ANG4 + 180
'********** SECOND QUAD *********************
TANG1 = 0
FOR DEG = 90 TO 180 STEP STP
X2 = COS(DEG)* R
DX2 = COS(ATU) * X2
NX2 = DX2 + ORL
Z = H
DZ = SIN(ATU) * X2
NZ = Z + DZ
Y2 = (SIN(DEG) * R) + OFB
X22 = COS(DEG + STP) * R
DX22 = COS(ATU) * X22
NX22 = DX22 + ORL
Z1 = H
DZ1 = SIN(ATU) * X22
NZ1 = Z1 + DZ1
Y22 = (SIN(DEG + STP)* R) + OFB
IF (DEG + STP) > 180 THEN EXIT FOR
L2 = SQRT(ABS(NX2- (-L/2)) ^ 2 + ABS(Y2 - YP2) ^ 2 + ABS(NZ) ^ 2)
L22 = SQRT(ABS(NX22 - (-XP2)) ^ 2 + ABS(Y22 - YP2) ^ 2 + ABS(NZ1) ^ 2)
ANGQ2 = ACOS((ABS(L22) ^ 2 + ABS(L2) ^ 2 - ABS(CHORD) ^ 2 )/(2*L22*L2))
TANG1 = TANG1 + ANGQ2
>LINE
{
<POINTXYZ [CX2, CY2, CZ2]
<POINTPOLAR [L22, (ANG4 + TANG1), 0]
}
NEXT
'*****************LAST TRIANGLE OF FIRST SECTION
LASTANG = ANG4 + TANG1
XS3 = COS(180)* R
DXS3 = COS(ATU) * XS3
NXS3 = DXS3 + ORL
Z = H
DZ = SIN(ATU) * XS3
NZ = Z + DZ
YS3 = (SIN(180) * R) + OFB
LS3 = SQRT(ABS(NXS3 - (-L/2)) ^ 2 + ABS(YS1 - YP1) ^ 2 + ABS(NZ) ^ 2)
ANGLB = ACOS((ABS(W/2) ^ 2 + ABS(L22) ^ 2 - ABS(LS3) ^ 2 )/(2*(W/2)*L22))
>LINE
{
<POINTXYZ [CX2,CY2,CZ2]
<POINTPOLAR [L22, LASTANG, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX2 BY2 BZ2 2
>LINE
{
<POINTXYZ [CX2,CY2,CZ2]
<POINTPOLAR [(W/2), (LASTANG + ANGLB),0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX3 BY3 BZ3 2
>LINE
{
<POINTXYZ [BX3,BY3,BZ3]
<POINTXYZ [BX2,BY2,BZ2]
}
GOSUB SECOND
END
'****************END OD FIRST HALF
'***************** SECOND HALF
SECOND:
LAYER(10)=14
LAYER(1)=0
SYS(300)=255
SYS(301)=0
SYS(302)=0
>REGENERATE
{
}
S = S
D = D
ORL = -(ORL)
OFB = -(OFB)
ATU = -(ATU)
L = L
W = W
H = H
C = 3.1416*D
STP = 360/S
XP1 = L / 2
XP2 = XP1
XP3 = 0
YP1 = 0
YP2 = W / 2
YP3 = YP2
'**************************FIRST SIDE
XS1 = COS(0)* R
DXS1 = COS(ATU) * XS1
NXS1 = DXS1 + ORL
Z = H
DZ = SIN(ATU) * XS1
NZ = Z + DZ
YS1 = (SIN(0) * R) + OFB
LS1 = SQRT(ABS(NXS1 - XP1) ^ 2 + ABS(YS1 - YP1) ^ 2 + ABS(NZ) ^ 2)
>LINE
{
<POINTXYZ 20,0,0
<POINTXYZ [(20+YP2),0,0]
}
LINE1 = SQRT(ABS(NXS1 - XP2) ^ 2 + ABS(YS1 - YP2) ^ 2 + ABS(NZ) ^ 2)
ANG1 = ACOS((ABS(LINE1) ^ 2 + ABS(YP2) ^ 2 - ABS(LS1) ^ 2 )/(2*LINE1*YP2))
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LINE1, ANG1, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL QX1 QY1 QZ1 1 'FIRST POINTVAL ALSO VERTEX
POINTVAL QX2 QY2 QZ2 2
>LINE
{
<POINTXYZ [(YP2+20),0,0]
<POINTXYZ [QX2, QY2, QZ2]
}
'FIRST QUAD *****************************
'J = 1
TANG = 0
CHORD = D * SIN(STP/2)
' CHORD = D * SIN(STP/2)
FOR DEG = 0 TO 90 STEP STP
'DEG = DEG + STP
X1 = COS(DEG)* R
DX1 = COS(ATU) * X1
NX1 = DX1 + ORL
Z = H
DZ = SIN(ATU) * X1
NZ = Z + DZ
Y1 = (SIN(DEG)* R) + OFB
X11 = COS(DEG + STP)* R
DX11 = COS(ATU) * X11
NX11 = DX11 + ORL
Z1 = H
DZ1 = SIN(ATU) * X11
NZ1 = Z1 + DZ1
Y11 = (SIN(DEG + STP)* R) + OFB
IF (DEG + STP) > 90 THEN EXIT FOR
L1 = SQRT(ABS(NX1 - XP2) ^ 2 + ABS(Y1 - YP2) ^ 2 + ABS(NZ) ^ 2)
L11 = SQRT(ABS(NX11 - XP2) ^ 2 + ABS(Y11 - YP2) ^ 2 + ABS(NZ1) ^ 2)
ANGQ1 = ACOS((ABS(L11) ^ 2 + ABS(L1) ^ 2 - ABS(CHORD) ^ 2 )/(2*L11*L1))
TANG = TANG + ANGQ1
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [L11, (ANG1 + TANG), 0]
}
NEXT
'************ FIRST BACK TRIANGLE **********************************
LFB = L11
LANG = ANG1+TANG
XS2 = COS(90)* R
DXS2 = COS(ATU) * XS2
NXS2 = DXS2 + ORL
Z = H
DZ = SIN(ATU) * XS2
NZ = Z + DZ
YS2 = (SIN(90) * R) + OFB
LS2 = SQRT(ABS(NXS2 - XP3) ^ 2 + ABS(YS2 - YP3) ^ 2 + ABS(NZ) ^ 2)
ANGFB = ACOS((ABS(XP1) ^ 2 + ABS(LFB) ^ 2 - ABS(LS2) ^ 2 )/(2*XP1*LFB))
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [LFB, LANG, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX1 BY1 BZ1 2
>LINE
{
<POINTXYZ 20,0,0
<POINTPOLAR [XP1, (LANG + ANGFB), 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX3 BY3 BZ3 2
>LINE
{
<POINTXYZ [BX1,BY1,BZ1]
<POINTXYZ [BX3,BY3,BZ3]
}
'********** SECOND QUAD *****************
'XP4=-L/2,'YP4=YP3,'XP5=XP4,'YP5=0
>LINE
{
<POINTXYZ [BX3,BY3,BZ3]
<POINTPOLAR [XP1, (LANG + ANGFB) , 0]
<POINTXYZ [BX1,BY1,BZ1]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL CX2 CY2 CZ2 2
LNL = SQRT(ABS(BX1-CX2)^2 + ABS(BY1-CY2)^2)
XPLR = BX1 - CX2
YPLR = BY1 - CY2
GOSUB CHOICE
'IF ANG4 < 0 THEN ANG4 = ANG4 + 180
'********** SECOND QUAD *********************
TANG1 = 0
FOR DEG = 90 TO 180 STEP STP
X2 = COS(DEG)* R
DX2 = COS(ATU) * X2
NX2 = DX2 + ORL
Z = H
DZ = SIN(ATU) * X2
NZ = Z + DZ
Y2 = (SIN(DEG) * R) + OFB
X22 = COS(DEG + STP) * R
DX22 = COS(ATU) * X22
NX22 = DX22 + ORL
Z1 = H
DZ1 = SIN(ATU) * X22
NZ1 = Z1 + DZ1
Y22 = (SIN(DEG + STP)* R) + OFB
IF (DEG + STP) > 180 THEN EXIT FOR
L2 = SQRT(ABS(NX2- (-L/2)) ^ 2 + ABS(Y2 - YP2) ^ 2 + ABS(NZ) ^ 2)
L22 = SQRT(ABS(NX22 - (-XP2)) ^ 2 + ABS(Y22 - YP2) ^ 2 + ABS(NZ1) ^ 2)
ANGQ2 = ACOS((ABS(L22) ^ 2 + ABS(L2) ^ 2 - ABS(CHORD) ^ 2 )/(2*L22*L2))
TANG1 = TANG1 + ANGQ2
>LINE
{
<POINTXYZ [CX2, CY2, CZ2]
<POINTPOLAR [L22, (ANG4 + TANG1), 0]
}
NEXT
'*****************LAST TRIANGLE OF FIRST SECTION
LASTANG = ANG4 + TANG1
XS3 = COS(180)* R
DXS3 = COS(ATU) * XS3
NXS3 = DXS3 + ORL
Z = H
DZ = SIN(ATU) * XS3
NZ = Z + DZ
YS3 = (SIN(180) * R) + OFB
LS3 = SQRT(ABS(NXS3 - (-L/2)) ^ 2 + ABS(YS1 - YP1) ^ 2 + ABS(NZ) ^ 2)
ANGLB = ACOS((ABS(W/2) ^ 2 + ABS(L22) ^ 2 - ABS(LS3) ^ 2 )/(2*(W/2)*L22))
>LINE
{
<POINTXYZ [CX2,CY2,CZ2]
<POINTPOLAR [L22, LASTANG, 0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX2 BY2 BZ2 2
>LINE
{
<POINTXYZ [CX2,CY2,CZ2]
<POINTPOLAR [(W/2), (LASTANG + ANGLB),0]
}
ENT = SYS(9)
ENTITY ENT
POINTVAL BX3 BY3 BZ3 2
>LINE
{
<POINTXYZ [BX3,BY3,BZ3]
<POINTXYZ [BX2,BY2,BZ2]
}
RETURN
CHOICE:
ON ERROR GOTO ERHAN
ANG4 = ATAN(YPLR/XPLR)
ERHAN:
RESUME DOCASE
DOCASE:
IF XPLR > 0 AND YPLR = 0 THEN ANG4 = 0
IF XPLR > 0 AND YPLR > 0 THEN ANG4 = ANG4
IF XPLR < 0 AND YPLR > 0 THEN ANG4 = ANG4 + 180
IF XPLR = 0 AND YPLR > 0 THEN ANG4 = 90
IF XPLR > 0 AND YPLR < 0 THEN ANG4 = ANG4
IF XPLR < 0 AND YPLR = 0 THEN ANG4 = 180
IF XPLR < 0 AND YPLR < 0 THEN ANG4 = ANG4 - 180
IF XPLR = 0 AND YPLR < 0 THEN ANG4 = -90
RETURN
Also the points file is a separate program, you run it, click on chosen points and they are stored in a text file.
please post back here when done.