private static void DrawArrow( GeometrySink sink, ReadOnlySpan <ImmutableVec2_float> bezier, float arrowSize) { var b1X = BiaNodeEditorHelper.Bezier(bezier[0].X, bezier[1].X, bezier[2].X, bezier[3].X, 0.5001f); var b1Y = BiaNodeEditorHelper.Bezier(bezier[0].Y, bezier[1].Y, bezier[2].Y, bezier[3].Y, 0.5001f); var b2X = BiaNodeEditorHelper.Bezier(bezier[0].X, bezier[1].X, bezier[2].X, bezier[3].X, 0.5f); var b2Y = BiaNodeEditorHelper.Bezier(bezier[0].Y, bezier[1].Y, bezier[2].Y, bezier[3].Y, 0.5f); var sx = b1X - b2X; var sy = b1Y - b2Y; var r = MathF.Atan2(sy, sx) + MathF.PI * 0.5f; var m = (MathF.Sin(r), MathF.Cos(r)); var l1 = new ImmutableVec2_float(arrowSize / 1.732f, arrowSize / 1.732f * 2.0f); var l2 = new ImmutableVec2_float(-arrowSize / 1.732f, arrowSize / 1.732f * 2.0f); var t1X = (bezier[0].X + bezier[3].X) * 0.5f; var t1Y = (bezier[0].Y + bezier[3].Y) * 0.5f; var t2 = Rotate(m, l1); var t3 = Rotate(m, l2); sink.BeginFigure(new RawVector2(t1X, t1Y), FigureBegin.Filled); sink.AddLine(new RawVector2(t2.X + t1X, t2.Y + t1Y)); sink.AddLine(new RawVector2(t3.X + t1X, t3.Y + t1Y)); sink.EndFigure(FigureEnd.Closed); }
public void Setup() { var r = new Random(); Data = new ImmutableVec2_float[4 * 1000000]; for (var i = 0; i != Data.Length; ++i) { Data[i] = new ImmutableVec2_float((float)r.NextDouble(), (float)r.NextDouble()); } }
public static void MakeBezierCurve(this IBiaNodeLink self, Span <ImmutableVec2_float> result) { var item1 = self.ItemSlot1.Item ?? throw new NullReferenceException(); var item2 = self.ItemSlot2.Item ?? throw new NullReferenceException(); var pos1 = item1.MakeSlotPosDefault(self.InternalData().Slot1 !); var pos2 = item2.MakeSlotPosDefault(self.InternalData().Slot2 !); var pos1C = BiaNodeEditorHelper.MakeBezierControlPoint(pos1, self.InternalData().Slot1 !.Dir); var pos2C = BiaNodeEditorHelper.MakeBezierControlPoint(pos2, self.InternalData().Slot2 !.Dir); result[0] = new ImmutableVec2_float((float)pos1.X, (float)pos1.Y); result[1] = new ImmutableVec2_float((float)pos1C.X, (float)pos1C.Y); result[2] = new ImmutableVec2_float((float)pos2C.X, (float)pos2C.Y); result[3] = new ImmutableVec2_float((float)pos2.X, (float)pos2.Y); }