2016-04-06 51 views
1

Bir DrawNode nesnesi kullanarak yuvarlatılmış köşeli bir Rect çizmek mümkün mü? Bence Bezier eğrileri kullanarak bir şey mümkün, ama bazı denemeler yaptım ve bununla başa çıkamayacağımı düşünüyorum. API baktığımızdaYuvarlatılmış Köşeler Cocos 2d-x Bezier ile rect

Ben sadece bu 2 işlevleri bulduk:

drawQuadBezier(const Vec2 &origin, const Vec2 &control, const Vec2 &destination, unsigned int segments, const Color4F &color)

drawCubicBezier(const Vec2 &origin, const Vec2 &control1, const Vec2 &control2, const Vec2 &destination, unsigned int segments, const Color4F &color)


[cevap sonrasında Modifiye]

Ben Cocos2dx yanıtını uyguladık, belki biri bulmak bu yararlı:

auto MagicConst = 0.552; 
auto position = 150; 
auto R = 50; 

Vec2 TopLeft = Vec2(position, position + R * 2); 
Vec2 TopRight = Vec2(position + R * 2, position + R * 2); 
Vec2 BottomRight = Vec2(position + R * 2, position); 
Vec2 BottomLeft = Vec2(position, position); 

Vec2 originTL = Vec2(TopLeft.x, TopLeft.y - R); 
Vec2 originTR = Vec2(TopRight.x - R, TopRight.y); 
Vec2 originBR = Vec2(BottomRight.x - R, BottomRight.y); 
Vec2 originBL = Vec2(BottomLeft.x, BottomLeft.y + R); 

Vec2 control1TL = Vec2(TopLeft.x, (int) (TopLeft.y - R * (1 - MagicConst))); 
Vec2 control1TR = Vec2((int) (TopRight.x - R * (1 - MagicConst)), TopRight.y); 
Vec2 control1BR = Vec2((int) (BottomRight.x - R * (1 - MagicConst)), BottomRight.y); 
Vec2 control1BL = Vec2(BottomLeft.x, (int) (BottomLeft.y + R * (1 - MagicConst))); 

Vec2 control2TL = Vec2((int) (TopLeft.x + R * (1 - MagicConst)), TopLeft.y); 
Vec2 control2TR = Vec2(TopRight.x, (int) (TopRight.y - R * (1 - MagicConst))); 
Vec2 control2BR = Vec2(BottomRight.x, (int) (BottomRight.y + R * (1 - MagicConst))); 
Vec2 control2BL = Vec2((int) (BottomLeft.x + R * (1 - MagicConst)), BottomLeft.y); 

Vec2 destinationTL = Vec2(TopLeft.x + R, TopLeft.y); 
Vec2 destinationTR = Vec2(TopRight.x, TopRight.y - R); 
Vec2 destinationBR = Vec2(BottomRight.x, BottomRight.y + R); 
Vec2 destinationBL = Vec2(BottomLeft.x + R, BottomLeft.y); 

auto roundCorner = DrawNode::create(); 
roundCorner->drawCubicBezier(originTL, control1TL, control2TL, destinationTL, 10, Color4F::RED); 
roundCorner->drawCubicBezier(originTR, control1TR, control2TR, destinationTR, 10, Color4F::GREEN); 
roundCorner->drawCubicBezier(originBR, control1BR, control2BR, destinationBR, 10, Color4F::YELLOW); 
roundCorner->drawCubicBezier(originBL, control1BL, control2BL, destinationBL, 10, Color4F::WHITE); 
addChild(roundCorner); 

Bu üretecek (sadece yüksek hassasiyet gerekmiyorsa int bazı casting yapılır) : http://i.stack.imgur.com/mdEOM.png

Artık köşeleri istediğiniz gibi yuvarlamak için MagicConst'u değiştirebilirsiniz. MagicConst = 0.9 ile Örneğin

: http://i.stack.imgur.com/9V5cr.png

istediğim sonucudur bu! ;) (size @Mbo) thank

(Henüz gömülü görüntüyü) mesaj gönderemezsiniz: P

cevap

1

O yuvarlak köşe yapmak için çemberin dörtte yaklaşır kübik Bezier eğrisini hesaplamak mümkündür. eksen hizalı dikdörtgen (noktası topLeft) ve ark oluşumu R yarıçapı üst sol köşesi için
Örnek:

Düzenleme: değişmiş -/+

about MagicConstant

MagicConst = 0.552 
Bezier.origin.X = ToplLeft.X 
Bezier.origin.Y = ToplLeft.Y + R 
Bezier.control1.X = ToplLeft.X 
Bezier.control1.Y = ToplLeft.Y + R * (1-MagicConst) 
Bezier.control2.X = ToplLeft.X + R * (1-MagicConst) 
Bezier.control2.Y = ToplLeft.Y 
Bezier.destination.X = ToplLeft.X + R 
Bezier.destination.Y = ToplLeft.Y 
işaretleri

kolayca can Diğer köşeler için benzer simetrik koordinatları bulun. Aşırı kısa dikdörtgen kenarları düşünmüyordum (< 2 * R)

+0

Teşekkürler @Mbo aklımı açtın, şimdi bunu mümkün kılmak için cocos2dx'de yazılan kodu kullanarak sorumu düzenliyorum;) –