-2
A
答えて
5
複雑な図形を描画するための簡単な方法。アンチエイリアスが必要な場合は、GDIPlusまたはその他の高度なグラフィック手段を使用してください。
procedure DrawCurveArrow(ACanvas: TCanvas; AColor: TColor;
X0, Y0, Size: Integer);
const
Magic = 0.552; // constant to approximate circular arc with Bezier curve
var
Pt: array of TPoint;
Flags: array of Byte;
R, RMag: Integer;
begin
SetLength(Pt, 18);
SetLength(Flags, 18);
R := 5 * Size div 16;
RMag := Round(R * Magic);
Pt[0] := Point(X0 + 1, Y0); // to thicken tail a bit
Flags[0] := PT_MOVETO;
Pt[1] := Point(X0 + 1, Y0 - RMag);
Flags[1] := PT_BEZIERTO;
Pt[2] := Point(X0 + R - RMag, Y0 - R);
Flags[2] := PT_BEZIERTO;
Pt[3] := Point(X0 + R, Y0 - R);
Flags[3] := PT_BEZIERTO;
Pt[4] := Point(X0 + R + RMag, Y0 - R);
Flags[4] := PT_BEZIERTO;
Pt[5] := Point(X0 + 2 * R, Y0 - RMag);
Flags[5] := PT_BEZIERTO;
Pt[6] := Point(X0 + 2 * R, Y0);
Flags[6] := PT_BEZIERTO;
Pt[7] := Point(X0 + Size div 2, Y0);
Flags[7] := PT_LINETO;
Pt[8] := Point(X0 + Size * 3 div 4, Y0 + Size div 4);
Flags[8] := PT_LINETO;
Pt[9] := Point(X0 + Size, Y0);
Flags[9] := PT_LINETO;
Pt[10] := Point(X0 + 7 * Size div 8, Y0);
Flags[10] := PT_LINETO;
R := 7 * Size div 16;
RMag := Round(R * Magic);
Pt[11] := Point(X0 + 2 * R, Y0 - RMag);
Flags[11] := PT_BEZIERTO;
Pt[12] := Point(X0 + R + RMag, Y0 - R);
Flags[12] := PT_BEZIERTO;
Pt[13] := Point(X0 + R, Y0 - R);
Flags[13] := PT_BEZIERTO;
Pt[14] := Point(X0 + R - RMag, Y0 - R);
Flags[14] := PT_BEZIERTO;
Pt[15] := Point(X0, Y0 - RMag);
Flags[15] := PT_BEZIERTO;
Pt[16] := Point(X0, Y0);
Flags[16] := PT_BEZIERTO;
Pt[17] := Point(X0 + 1, Y0);
Flags[17] := PT_LINETO or PT_CLOSEFIGURE;
BeginPath(ACanvas.Handle);
PolyDraw(ACanvas.Handle, Pt[0], Flags[0], Length(Pt));
EndPath(ACanvas.Handle);
ACanvas.Brush.Color := AColor;
FillPath(ACanvas.Handle);
end;
begin
DrawCurveArrow(Canvas, clBlue, 100, 200, 300);
3
さて、MBoは私より速く、私のソリューションは私よりも優れていたようです。しかし、私はとにかく私の答えを入れます。白い背景でカウントされることに注意してください(MBoの解は背景に依存しません)。
procedure draw_arrow(canvas: TCanvas; x, y, size: Integer; color: TColor);
begin
with canvas do
begin
Pen.Style:=psClear;
Brush.Style:=bsSolid;
Brush.Color:=color;
Ellipse(x+1, y, x+size+1, y+size);
Brush.Color:=clWhite;
Ellipse(x, y+size div 6, x+Round(size/1.5), y+Round(size/1.2));
Rectangle(x, y+size div 2, x+size+1, y+size);
Brush.Color:=color;
Polygon([Point(x+size div 2, y+size div 2), Point(x+size div 2+Round(size/1.5), y+size div 2), Point(x+size-size div 6, y+Round(size/1.2))]);
end;
end;
関連する問題
- 1. HTMLキャンバス - 曲線の矢印を描く
- 2. VB6の線オブジェクトに矢印を描く
- 3. グラファンに曲線を描く
- 4. 矢印の形のマスクの周りに境界線を描く
- 5. 破線の矢印を描くには?私はこのような矢印描きたい
- 6. iOSスワイプパスの後に矢印付きスイングフィンガーの線を描く
- 7. PyGameの線の方向に続く矢印の描画
- 8. d3.jsを使用して矢印で線を描く方法
- 9. 線の勾配を使用して線の終点に矢印を描く
- 10. スロー - 曲線を描くときのエラー
- 11. この矢印を描くには?
- 12. Matlabで曲線を描く方法
- 13. 均一な2次曲線を描く
- 14. Javaでガウス曲線を描く
- 15. アンドロイドで曲線を描く方法
- 16. ビットごとに曲線を描く
- 17. Python Tkinter:ラベル内に矢印を描く
- 18. リスト間に矢印を描く
- 19. 矢印を描く方法JavaFX? (ペイン)
- 20. java2dで矢印を描くには?
- 21. ベジェ曲線の各点に接線を描くopengl
- 22. ベジェ曲線の間に垂直線を描く
- 23. Bing Maps v8の曲線(ポリライン)を矢印(フロー方向)で描画する方法は? JS
- 24. javascript canvas:曲線付き移動平均線を描く
- 25. Visual Studioのコードエディタで、緑色の曲線の矢印の意味は?
- 26. ベクトルからポイントのセットを使ってベジェ曲線を描く
- 27. Unity3dベクトル間の角度を示す曲線を描く
- 28. ios内のポイントのセットから曲線(パス)を描く方法
- 29. OpenLayersを3:マルチライン上の描画矢印
- 30. AndroidのCanvasの円の外にビットマップ(矢印)を描く
2つの円、長方形、三角形を描画します。これは単純な幾何学的な作業です。 – Ari0nhh
@ Ari0nhh何のために矩形が必要ですか?白色の背景? – dummzeuch
@dummzeuch大きな円の底を切り取る。 – Ari0nhh