내 응용 프로그램에서 Google지도 마커 (그림 참조)와 같은 "마커"를 TCanvas에 그려야합니다.델파이의 TCanvas와 함께 Google지도처럼 마커 그리기
반경, 높이 원점 매개 변수로 내가 사용하고 싶습니다 :
내가 사용하는 알고리즘에 대한 아이디어를 필요는 없습니다. 상단을 그리려면 호를 사용할 수 있지만 어떻게 그릴 수 있습니까? 참고 : GDI와 GDI +를 모두 사용해야하므로 모든 솔루션을 환영합니다.
내 응용 프로그램에서 Google지도 마커 (그림 참조)와 같은 "마커"를 TCanvas에 그려야합니다.델파이의 TCanvas와 함께 Google지도처럼 마커 그리기
반경, 높이 원점 매개 변수로 내가 사용하고 싶습니다 :
내가 사용하는 알고리즘에 대한 아이디어를 필요는 없습니다. 상단을 그리려면 호를 사용할 수 있지만 어떻게 그릴 수 있습니까? 참고 : GDI와 GDI +를 모두 사용해야하므로 모든 솔루션을 환영합니다.
여기에 200x200 PaintBox
을 사용한 빠른 예가 있습니다. 알고리즘에 대한 아이디어는 적어도 제공해야합니다. 중간에 검은 점을 그릴 수 있다고 생각합니다. Bezier Curves에 읽으십시오; 시작 단부 및 2 개의 제어점 -은 PolyBezier
cubic Bezier curves. (link)
포 포인트는 큐빅 베 지어 곡선을 정의하는 정의한다. 제어점은 선이 처음부터 끝까지 움직일 때 곡률 강도를 정의합니다.
var origin, innerL, midL, midR, lft, tp, rgt, innerR : TPoint;
radius, hgt : integer;
begin
radius := 25;
hgt := 90;
origin.X := 100;
origin.Y := 180;
//control points
innerL.X := origin.X;
innerL.Y := origin.Y - (hgt - radius) div 3;
midL.X := origin.X - radius;
midL.Y := origin.Y - 2*((hgt - radius) div 3);
//top circle
lft.X := origin.X - radius;
lft.Y := origin.Y - (hgt - radius);
tp.X := origin.X;
tp.Y := origin.Y - hgt;
rgt.X := origin.X + radius;
rgt.Y := lft.Y;
//control points
midR.X := origin.X + radius;
midR.Y := midL.Y;
innerR.X := origin.X;
innerR.Y := innerL.Y;
PaintBox1.Canvas.Pen.Width := 2;
PaintBox1.Canvas.PolyBezier([origin, innerL, midL, lft]);
PaintBox1.Canvas.Arc(lft.X, tp.Y, rgt.X, rgt.Y + radius, rgt.X, rgt.Y, lft.X, lft.Y);
PaintBox1.Canvas.PolyBezier([rgt, midR, innerR, origin]);
//fill
PaintBox1.Canvas.Brush.Color := clYellow;
PaintBox1.Canvas.FloodFill(origin.X, origin.Y - radius,
Canvas.Pen.Color, TFillStyle.fsBorder);
end;
는 하나 베 지어이 할 수있는 지점 만족하려면
이
// add four more control TPoints
cornerL.X := lft.X;
cornerL.Y := tp.Y + radius div 2;
cL2.X := lft.X + radius div 2;
cL2.Y := tp.Y;
cR2.X := rgt.X - radius div 2;
cR2.Y := tp.Y;
cornerR.X := rgt.X;
cornerR.Y := cornerL.Y;
PaintBox1.Canvas.PolyBezier([origin, innerL, midL, lft,
cornerL, cL2, tp, cR2, cornerR, rgt,
midR, innerR, origin]);
이전의 'FloodFill' 채우기가 필요하지 않습니다. 또한 전체 마커 모양을 베 지어 곡선으로 표현할 수 있습니다 (단일 PolyBezier 호출로 그립니다). – TLama
@TLama - 예, 베지에 하나만 사용할 수 있습니다. 나는 그것을 빠르게했고 4 개의 제어점을 더 정의하기를 원하지 않았습니다 - 그것은 생산이 아닌 교훈적인 것을 의미했습니다. 아크는 코드 작성이 빠르지 만 꼭 필요한 것은 아닙니다. 분명히 GDI 솔루션은 패스 (같은 방식으로 베 지어를 정의)와 경로를 사용하여 포스트 채우기가 자연스럽게 필요하지 않습니다. 다시 말하지만, 그를 위해 OP의 일을하려고하지 않는 것이 더 우울한 방법이었습니다. –
네, 그게 더 낫습니다 :-) 그리고 네 말이 맞아. GDI +를 사용하면 경로를 만들고 경로를 채울 수 있습니다. 거기가 더 쉽습니다. [+1] – TLama
내가 무례하고 싶지 않아,하지만 난이 델파이 또는 GDI와 함께 할 아무것도 가지고 생각하지 않는다 특히. 그것은 3 개의 매개 변수를 취하고 위와 같은 것을 출력하는 알고리즘을 찾는 것과 같습니다. –
@ GünthertheBeautiful 가능하지만 GDI와 GDI를 사용하여 델파이와 함께 할 필요가 있습니다. – Martin
일단 수학적 설명이 있으면 멋진 언어로 그릴 수 있습니다. delphi 질문이 아닙니다. FWIW Google은 래스터 이미지를 사용합니다. –