Показать сообщение отдельно
Старый 10.08.2014, 04:38   #399
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 243
Поблагодарили 1,095 раз(а) в 210 сообщениях
Вес репутации: 387
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Заготовка контура типа арки, только с острым углом.

Может быть полезна наличием функции (не найденных мною в предопределённых) сопряжения линии с точкой.

Скрытый текст


function MakeOstriy(ln,pv,
hv, hn)
{

Contour = NewContour();


HalfW= (pv.x-ln.x)/2

p1 = NewPoint(ln.x,pv.y-hv)
p2 = NewPoint(ln.x,ln.y+hn)
p3 = NewPoint(ln.x+HalfW,ln.y)

l1 = Contour.AddLine(p1,p2);


c = SopriajeniyeLinii_s_Tochkoy(l1,p2,p3,true);



Contour.AddList(c.MakeCopy());











p4 = NewPoint(ln.x+HalfW,pv.y)

c = SopriajeniyeLinii_s_Tochkoy(l1,p1,p4,false);



Contour.AddList(c.MakeCopy());

Contour.Symmetry(p3.x, 0, p3.x, 1, true)




return Contour;
}



function SopriajeniyeLinii_s_Tochkoy(l1,p1,p2,storona)
{


vspomContour = NewContour();

vspom_l = vspomContour.AddLine(p1,p2);


ul1= l1.LineAngle()/(Math.PI / 180)
u_vspom_l= vspom_l.LineAngle()/(Math.PI / 180)

ul1l2 = Math.abs(ul1-u_vspom_l+90)
if (ul1l2>180)
{
ul1l2= Math.abs((ul1l2-360))
}

b=vspom_l.ObjLength();
R =b/(2*Math.cos(ul1l2*(Math.PI / 180))) ; //http://www-formula.ru/index.php/lengthpartiesisoscelestriangle



center = NewPoint(p1.x+R, p1.y);

c = NewContour();
c.AddArc(p1, p2, center,storona);

return c
}


function MakePanel (hh,ww, otstup , hv, hn)
{


ln=NewPoint(otstup,otstup)

pv=NewPoint(ww-otstup,hh-otstup)


P = AddPanel(ww, hh);

StartEditing(P)

P.Contour.Subtraction(MakeOstriy(ln,pv,hv, hn));

//P.Contour.Addition(MakeEllipse(50, 140, ww*0.5, hh*0.5));
P.Build();
return P
}

x=0
p = MakePanel(770,300, 70 , 200, 200)

p.Translate(x,0,0)
x = x+ 300+100

p = MakePanel(770,400, 70 , 250, 250)

p.Translate(x,0,0)
x = x+ 300+100
[свернуть]



Заготовка обыкновенного 6ти угольника.

Скрытый текст



function Make6Ugol(ln,pv,
hln, wln, hpn, wpn,
hlv, wlv, hpv, wpv,radius)
{

Contour = NewContour();
// Intermediate ellipse quantities.

p1 = NewPoint(ln.x,ln.y+hln)
p2 = NewPoint(ln.x+wln,ln.y)
p3 = NewPoint(pv.x-wpn,ln.y)

l1 = Contour.AddLine(p1.x,p1.y,p2.x,p2.y);
l2 = Contour.AddLine(p2.x,p2.y,p3.x,p3.y);


p4 = NewPoint(pv.x,ln.y+hpn)

l3 = Contour.AddLine(p3.x,p3.y,p4.x,p4.y);




p5 = NewPoint(pv.x,pv.y-hpv)

l4 =Contour.AddLine(p4.x,p4.y,p5.x,p5.y);



p6 = NewPoint(pv.x-wpv,pv.y)

l5 =Contour.AddLine(p5.x,p5.y,p6.x,p6.y);

p7 = NewPoint(ln.x+wlv,pv.y)

l6 =Contour.AddLine(p6.x,p6.y,p7.x,p7.y);


p8 = NewPoint(ln.x,pv.y-hlv)

l7 =Contour.AddLine(p7.x,p7.y,p8.x,p8.y);


//p9 = NewPoint(ln.x,ln.y+hln)

l8 =Contour.AddLine(p8.x,p8.y,p1.x,p1.y);

if (radius>0)
{

Contour.RoundingEx(l1, l2, p2.x+1, p2.y+1, radius)

Contour.RoundingEx(l2, l3, p3.x-1, p3.y+1, radius)

Contour.RoundingEx(l3, l4, p4.x-1, p4.y+1, radius)

Contour.RoundingEx(l4, l5, p5.x-1, p5.y-1, radius)

Contour.RoundingEx(l5, l6, p6.x-1, p6.y-1, radius)

Contour.RoundingEx(l6, l7, p7.x+1, p7.y-1, radius)

Contour.RoundingEx(l7, l8, p8.x+1, p8.y-1, radius)

Contour.RoundingEx(l8, l1, p1.x+1, p1.y+1, radius)

}




return Contour;
}







hh=770
ww=300

otstup = 70
radius = 30;
ln=NewPoint(otstup,otstup)

pv=NewPoint(ww-otstup,hh-otstup)


P = AddPanel(ww, hh);



P.Contour.Subtraction(Make6Ugol(ln,pv, 50, 50,50,50,50, 50,50,50,radius));

//P.Contour.Addition(MakeEllipse(50, 140, ww*0.5, hh*0.5));



[свернуть]
v22884 вне форума   Ответить с цитированием Вверх
3 пользователя(ей) сказали cпасибо:
Briz (10.08.2014), maxgmv (11.08.2014), Oldman (10.08.2014)