tôi muốn tạo bố cục cây bố trí đẹp và một chút vấp với các cạnh cong. Vấn đề là với các góc khác nhau giữa các điểm nguồn và đích, các cạnh được vẽ khác nhau. Các bức ảnh được cung cấp là từ biểu đồ duy nhất để bạn có thể thấy chúng khác nhau như thế nào cho các hướng cạnh khác nhau. Tôi nghĩ rằng điểm là trong thế hệ điểm kiểm soát đường cong beizer và tôi chỉ không thể hiểu làm thế nào để sửa chữa chúng.Bố trí biểu đồ cây xuyên tâm: sửa đường cong beizer
Tôi muốn chúng được vẽ theo cùng một cách bất kể hướng của cạnh là gì.
Làm cách nào để đạt được điều này như trong Pic1? Làm thế nào tôi có thể đạt được điều này như trong Pic2?
Như ở đây: https://bl.ocks.org/mbostock/4063550
Cảm ơn bạn!
Code:
//draw using DrawingContext of the DrawingVisual
//gen 2 control points
double dx = target.X - source.X, dy = target.Y - source.Y;
var pts = new[]
{
new Point(source.X + 2*dx/3, source.Y),
new Point(target.X - dx/8, target.Y - dy/8)
};
//get geometry
var geometry = new StreamGeometry { FillRule = FillRule.EvenOdd };
using (var ctx = geometry.Open())
{
ctx.BeginFigure(START_POINT, false /* is filled */, false /* is closed */);
ctx.BezierTo(pts[0], pts[1], END_POINT, true, false);
}
geometry.Freeze();
//draw it
dc.DrawGeometry(DrawingBrush, DrawingPen, geometry);
UPDATE 1: Tôi đã có góc giữa đỉnh trước và nguồn trong radian bằng cách sử dụng công thức sau: Math.Atan2 (trước. Y - source.Y, source.X - prev.X); Nhưng tôi vẫn nhận được các cạnh như trong Pic.4.
UPDATE 2 Các trước đỉnh pos cho branchAngle tính toán là không chính xác vì vậy tôi quyết định đi một góc trung bình giữa tất cả các cạnh trong một chi nhánh như branchAngle. Cách tiếp cận này thất bại khi các cạnh từ một brach là khoảng 180 deg mark và branch có thể có các góc cạnh như 175, 176 .. -176 !! Tôi sử dụng mã này để làm cho chúng hoàn toàn tích cực:
var angle = Math.Atan2(point1.Y - point2.Y, point1.X - point2.X);
while (angle < 0d)
angle += Math.PI*2;
Nhưng bây giờ các góc có thể là 350, 359 .. 2 !!! Khá khó khăn để calc trung bình :) Bạn có thể vui lòng tư vấn cho tôi làm thế nào tôi có thể làm việc này xung quanh?
Cảm ơn bạn đã trả lời nhưng tôi vẫn nhận được kết quả lạ, vui lòng xem cập nhật 1 trong op. –
@Alexander xin lỗi về điều đó, đã phạm sai lầm trong dx và dy calc. Đã chuyển đổi sinB với cosB và ngược lại. – Funk
Dường như có lỗi đánh máy trong bản chỉnh sửa của bạn, branchAngle phải là 'Math.Atan2 (prev.Y - source.Y, prev.X - source.X)'. – Funk