blob: 27e70d4840481d07b53cc845f75b3959b02016ee (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
//
// 08.08.24
// 10.01.02
function Out=MakeBowdata(PA,PB,H)
global BOWSTART BOWEND
BOWSTART=PA;
BOWEND=PB;
Eps=10^(-5);
D=1/2*Vecnagasa(PB-PA);
R=(H^2+D^2)/(2*H);
A1=PA(1); A2=PA(2);
B1=PB(1); B2=PB(2);
if abs(A2-B2)>Eps
x=poly(0,'X');
y=-(A1-B1)*x/(A2-B2)+(1/2)*(A1^2+A2^2-B1^2-B2^2)/(A2-B2);
Eq1=(A1-x)^2+(A2-y)^2-R^2;
Tmp=coeff(Eq1);
C0=Tmp(1); C1=Tmp(2); C2=Tmp(3);
Det=sqrt(C1^2-4*C0*C2);
Ansx1=(-C1+Det)/(2*C2);
Ansx2=(-C1-Det)/(2*C2);
Tmp=horner(y,Ansx1);
PC=[Ansx1,Tmp];
Tmp=horner(y,Ansx2);
PC2=[Ansx2,Tmp];
else
Tmp=0.5*(PA+PB);
PC=Tmp+[0,R-H];
PC2=Tmp-[0,R-H];
end;
VA=PA-PC;
VB=PB-PC;
if VA(1)*VB(2)-VA(2)*VB(1)<0
PC=PC2;
end
AngA=acos((PA(1)-PC(1))/R);
if PA(2)-PC(2)<0
AngA=-AngA;
end
AngB=acos((PB(1)-PC(1))/R);
if PB(2)-PC(2)<0
AngB=-AngB;
end
if AngA>AngB
AngB=AngB+2*%pi;
end
Out=Mixmake(PC,R,AngA,AngB);
endfunction
|