70 lines
2.5 KiB
Plaintext
70 lines
2.5 KiB
Plaintext
@implements IDisposable
|
|
|
|
@inject IJSRuntime JSRuntime
|
|
|
|
<polyline @ref="Ref" />
|
|
|
|
|
|
@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);
|
|
}
|
|
}
|