@implements IDisposable @inject IJSRuntime JSRuntime @code { [Parameter, EditorRequired] public EdgeModel Model { get; set; } = null!; private ElementReference Ref; protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; await UpdatePathData(); await UpdateMaker(); } private async Task UpdatePathData() { string data = string.Empty; double sx = 0, sy = 0, mx = 0, my = 0, ex = 0, ey = 0; double sTime = 0.49, eTime = 0.5; if (Model.TrajectoryDegree == TrajectoryDegree.One) { sx = Model.X1; sy = Model.Y1; ex = Model.X2; ey = Model.Y2; } else if (Model.TrajectoryDegree == TrajectoryDegree.Two) { sx = (Model.X1 + Model.ControlPoint1X) / 2; sy = (Model.Y1 + Model.ControlPoint1Y) / 2; ex = (Model.X2 + Model.ControlPoint1X) / 2; ey = (Model.Y2 + Model.ControlPoint1Y) / 2; } else if (Model.TrajectoryDegree == TrajectoryDegree.Three) { sx = Math.Pow(1 - sTime, 3) * Model.X1 + 3 * Math.Pow(1 - sTime, 2) * sTime * Model.ControlPoint1X + 3 * Math.Pow(sTime, 2) * (1 - sTime) * Model.ControlPoint2X + Math.Pow(sTime, 3) * Model.X2; sy = Math.Pow(1 - sTime, 3) * Model.Y1 + 3 * Math.Pow(1 - sTime, 2) * sTime * Model.ControlPoint1Y + 3 * Math.Pow(sTime, 2) * (1 - sTime) * Model.ControlPoint2Y + Math.Pow(sTime, 3) * Model.Y2; ex = Math.Pow(1 - eTime, 3) * Model.X1 + 3 * Math.Pow(1 - eTime, 2) * eTime * Model.ControlPoint1X + 3 * Math.Pow(eTime, 2) * (1 - eTime) * Model.ControlPoint2X + Math.Pow(eTime, 3) * Model.X2; ey = Math.Pow(1 - eTime, 3) * Model.Y1 + 3 * Math.Pow(1 - eTime, 2) * eTime * Model.ControlPoint1Y + 3 * Math.Pow(eTime, 2) * (1 - eTime) * Model.ControlPoint2Y + Math.Pow(eTime, 3) * Model.Y2; } mx = (sx + ex) / 2; my = (sy + ey) / 2; await JSRuntime.InvokeVoidAsync("ElementSetAttribute", Ref, "points", $"{sx},{sy} {mx},{my} {ex},{ey}"); } private async Task UpdateMaker() { if (Model == null) return; await JSRuntime.InvokeVoidAsync("ElementSetAttribute", Ref, "marker-mid", MapSvgDefs.GetMakerMid(Model.DirectionAllowed)); } public void Dispose() { GC.SuppressFinalize(this); } }