Tekening op http://imgur.com/VJpdamL
Gegeven: A , B , C , z
Gevraagd: hoek: x , y
Code: Selecteer alles
hoekABC(Ax, Ay, Bx, By, Cx, Cy)={
Ax = Ax - Bx;
Ay = Ay - By;
Cx = Cx - Bx;
Cy = Cy - By;
\\ inner product:
ip = Ax*Cx + Ay*Cy;
\\ length of a:
la = sqrt(Ax*Ax + Ay*Ay);
\\ length of c:
lc = sqrt(Cx*Cx + Cy*Cy);
\\return value:
acos(ip/(la*lc))*180/Pi
}
\\ gegeven x = Qx, bereken coordinaten van P en lengte SP:
\\ P ligt boven Q op lijn QT, afstand PQ = Cl
\\ als we P weten snijden we lijn RP met lijn OT
\\ dan weten we punt S en afstand PS
calcPS(x)={
Qx = x;
\\ richtinsvector voor lijn l = QT:
RVx = Tx - Qx;
RVy = Ty - Qy;
\\ length of QT:
QTl = sqrt(RVx*RVx + RVy*RVy);
\\ calculate point P:
lambda = Cl / QTl;
Px = lambda*RVx + Qx;
Py = lambda*RVy + Qy;
\\ richtingsvector voor lijn m = RP
RVx = Px - Rx;
RVy = Py - Ry;
\\ length of RP:
RPl = sqrt(RVx*RVx + RVy*RVy);
\\ normaliseer richtingsvector tot lengte 1:
RVx = RVx / RPl;
RVy = RVy / RPl;
\\ snij lijn m (=RP) en k(=OT):
PS = (tanz*Px - Py) / (RVy - tanz*RVx);
\\RETURN PS:
PS
}
\\ benader de Qx waarvoor PS = C
losop()={
xlo = 0.01;
xhi = A - 0.01;
for(i=1,100,
xmid = (xlo+xhi)/2.0;
ymid = calcPS(xmid) - C;
if(ymid<0.0,
xlo = xmid,
\\ELSE:
xhi = xmid
);
);
\\RETURN Qx:
(xlo+xhi)/2.0
}
getxy(A,B,C,z)={
\\maak de lengtes globaal beschikbaar:
Al = A;
Bl = B;
Cl = C;
\\ coordinaten van punt T:
Tx = B*cos(z*Pi/180.0);
Ty = B*sin(z*Pi/180.0);
tanz = tan(z*Pi/180.0);
Rx = A;
Ry = 0.0;
Qy = 0.0;
Qx = losop();
print("Qx = ",Qx);
x = hoekABC(0.0, 0.0, Tx, Ty, Px, Py);
y = hoekABC(0.0, 0.0, Rx, Ry, Px, Py);
print("hoek x = ", x);
print("hoek y = ", y);
}
\\MAIN PROGRAM:
{
getxy(150,200,50,75);
}