gpt4 book ai didi

c - 如何用 Cairo 创建同心三角形?

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:48 25 4
gpt4 key购买 nike

我有三个点组成一个三角形(很明显)。但是我不想画这个三角形而是在里面画一个小一点。

Triangle

我如何使用 C 语言的 Cairo 来做到这一点?

最佳答案

我认为您需要计算新三角形的顶点,其边距与旧三角形的边距相等。

求相邻三角形边的单位 vector BD = BA/|BA|, BE = BC/|BC| ...(|BA| 是 vector BA 的长度)

求单位平分线BF = (BD + BE)/|BD + BE|

找到 F 点的最终位置(所需长度的平分线)BF = BF * NeededDistance/(BF x BE) ...(分母是叉积,等于Sin(ABC/2)

对 G 和 H 顶点执行相同的操作。

enter image description here

Delphi代码及结果:

var
P, V: array[0..2] of TPoint;
i, inext, iprev: Integer;
nx, ny, px, py, mx, my, coeff: Double;
distance: Integer;

procedure NormalizeVector(var dx, dy: Double);
var
revlen: Double;
begin
revlen := 1.0 / Hypot(dx, dy);
dx := dx * revlen;
dy := dy * revlen;
end;

begin
Canvas.Brush.Color := Color;
Canvas.FillRect(ClientRect); //clean the blackboard
Randomize;

//big triangle vertices
for i := 0 to 2 do
P[i] := Point(Random(500), Random(500));

//draw big triangle
Canvas.Brush.Style := bsClear;
Canvas.Polygon(P);

for i := 0 to 2 do begin
inext := (i + 1) mod 3; // next vertice index
iprev := (i - 1 + 3) mod 3; // previous vertice index
nx := P[inext].X - P[i].X; //vector to the next vertice
ny := P[inext].Y - P[i].Y;
px := P[iprev].X - P[i].X; //vector to the previous vertice
py := P[iprev].Y - P[i].Y;

NormalizeVector(nx, ny); //make unit vectors
NormalizeVector(px, py);

mx := nx + px;
my := ny + py;
NormalizeVector(mx, my); //unit bisector

distance := 20;
coeff := distance / (mx * py - my * px);
mx := mx * coeff;
my := my * coeff;

//inner triangle vertice
V[i] := Point(P[i].X + Round(mx), P[i].Y + Round(my));
end;

//draw inner triangle
Canvas.Polygon(V);

enter image description here

关于c - 如何用 Cairo 创建同心三角形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17295861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com