McNeel Wiki
Lien Vers Script
modifier · imprimer · aide · tous les sujets
Pages principales

AccuRender

Bongo

Brazil r/s

Flamingo

Penguin

Blogs de Rhino

Rhino

Laboratoires de Rhino

Recherche

Langues

Česky

Deutsch

English

Español

Français

Italiano

Polish

日本語

한국어

中文(繁體)

中文(简体)

 
.

' pntfillet : 2d fillet of 2 lines through a point

function ptw(a)
ptw=" w"&cstr(a(0))&","&cstr(a(1))&",0 "
end function
 
function v2prodi(a,b)
v2prodi=a(0)*b(0)+a(1)*b(1)
end function

function v2prode(a,b)
v2prode=a(0)*b(1)-a(1)*b(0)
end function

function v2ver(v)
m=sqr(v(0)^2+v(1)^2)
if m=0 then 
  v2ver=null
else
  v2ver=array(v(0)/m,v(1)/m)
end if
end function

function v2sub(a,b)
v2sub=array(a(0)-b(0),a(1)-b(1))
end function

function v2sum(a,b)
v2sum=array(a(0)+b(0),a(1)+b(1))
end function

function v2mul(v,a)
v2mul=array(v(0)*a,v(1)*a)
end function

function v2psuml(p,u,l)
v2psuml=array(p(0)+u(0)*l,p(1)+u(1)*l)
end function

function v2verpp(a,b)
v=v2sub(b,a)
v2verpp=v2ver(v)
end function

function v2mid(pa,pb)
v2mid=array((pa(0)+pb(0))/2,(pa(1)+pb(1))/2)
end function

function v2dist(a,b)
v2dist=sqr((a(0)-b(0))^2+(a(1)-b(1))^2)
end function

function prjptlin(pt,pl,ul)
l=v2prodi(v2sub(pt,pl),ul)
prjptlin=v2psuml(pl,ul,l)
end function

function intlinlin(pa,ua,pb,ub)
if abs(ua(0))>abs(ua(1)) then
  aa=(pb(0)-pa(0))/ua(0)
  bb=ub(0)/ua(0)
  h=(pb(1)-pa(1)-aa*ua(1))/(bb*ua(1)-ub(1))
  intlinlin=v2psuml(pb,ub,h)
else
  cc=(pa(0)-pb(0))/ub(0)
  dd=ua(0)/ub(0)
  k=(pb(1)-pa(1)+cc*ub(1))/(ua(1)-dd*ub(1))
  intlinlin=v2psuml(pa,ua,k)
end if
end function

sub main
la=rhino.getobject("First line ?")
lb=rhino.getobject("Second line ?")
pt=rhino.getpoint("Point ?")
rad=rhino.getstring("Radius Min or Max ?","Max",array("Min","Max"))
pa0=rhino.curvestartpoint(la)
pa1=rhino.curveendpoint(la)
pb0=rhino.curvestartpoint(lb)
pb1=rhino.curveendpoint(lb)
ua=v2verpp(pa0,pa1)
ub=v2verpp(pb0,pb1)
pint=intlinlin(pa0,ua,pb0,ub)
' rhino.addpoint(pint)
if v2dist(pint,pa0) > v2dist(pint,pa1) then
  tm=pa0
  pa0=pa1
  pa1=tm
  ua=v2verpp(pa0,pa1)
end if
if v2dist(pint,pb0) > v2dist(pint,pb1) then
  tm=pb0
  pb0=pb1
  pb1=tm
  ub=v2verpp(pb0,pb1)
end if
pa2=v2psuml(pint,ua,10)
pb2=v2psuml(pint,ub,10)
pm=v2mid(pa2,pb2)
' rhino.addpoint(pm)
um=v2verpp(pint,pm)
cosal=v2prodi(ua,um)
sinal=sqr(1-cosal*cosal)
kb=v2sub(pint,pt)
aa=um(0)^2+um(1)^2-sinal^2
bb=kb(0)*um(0)+kb(1)*um(1)
cc=kb(0)^2+kb(1)^2
k0=(-bb+sqr(bb*bb-aa*cc))/aa
k1=(-bb-sqr(bb*bb-aa*cc))/aa
c0=v2psuml(pint,um,k0)
c1=v2psuml(pint,um,k1)
' rhino.addpoint(c0)
' rhino.addpoint(c1)
r0=v2dist(c0,pt)
r1=v2dist(c1,pt)
if r0>r1 then
  tm=r0
  r0=r1
  r1=tm
  tm=c0
  c0=c1
  c1=tm
end if
if rad="Min" then
  r=r0
  c=c0
else
  r=r1
  c=c1
end if
pra=prjptlin(c,pint,ua)
prb=prjptlin(c,pint,ub)
' rhino.addpoint(pra)
' rhino.addpoint(prb)
rhino.command"arc startpoint"&ptw(pra)&ptw(prb)&ptw(pt)
' rhino.command"fillet "&cstr(r)&" selid "&la&" selid "&lb
end sub

pi=3.14159265358979323846

main

renommer · modifications · historique · souscriptions · perdus-trouvés · références · chargement de fichier