public static Triangle FromTwoPointsAndTwoLengths(Point point1, Point point2, double l1, double l2) { double l3 = point1.Distance(point2); double area = Triangle.AreaByLenghts(l1, l2, l3); double angle = Math.Asin(2 * area / (l1 * l3)); Vector horizontal = point1.VectorTo(point1.AddX(1)); double angle0 = horizontal.AngleWith(point1.VectorTo(point2)); double x = l1 * Math.Cos(angle0 - angle); double y = l1 * Math.Sin(angle0 - angle); Point point3 = point1.AddX(x).AddY(y); return new Triangle(point1, point2, point3); }
public static Triangle FromTwoPointsAndTwoLengths(Point point1, Point point2, double l1, double l2) { double l3 = point1.Distance(point2); double area = Triangle.AreaByLenghts(l1, l2, l3); double angle = Math.Asin(2 * area / (l1 * l3)); Vector horizontal = point1.VectorTo(point1.AddX(1)); double angle0 = horizontal.AngleWith(point1.VectorTo(point2)); double x = l1 * Math.Cos(angle0 - angle); double y = l1 * Math.Sin(angle0 - angle); Point point3 = point1.AddX(x).AddY(y); return(new Triangle(point1, point2, point3)); }
public static Point[] CalcBezier(Point pStart, Point pEnd, bool p1left = true, bool p2left = false) { var top = pStart.Y < pEnd.Y ? pStart.Y : pEnd.Y; var bottom = top == pStart.Y ? pEnd.Y : pStart.Y; var left = pStart.X < pEnd.X ? pStart.X : pEnd.X; var right = left == pStart.X ? pEnd.X : pStart.X; var disX = right - left; var disY = bottom - top; var ps = pStart; var p1 = p1left ? pStart.AddX(40) : pStart.SubX(40); var p2 = p2left ? pEnd.AddX(40) : pEnd.SubX(40); var inL = p2.X < p1.X ? p2.X : p1.X; var pM = p1left != p2left ? new Point(left + disX / 2, top + disY / 2) : new Point(inL + disX / 2, top + disY / 2); var pE = pEnd; return(new Point[] { ps, p1, p1, pM, p2, p2, pE }); }