Bug Fix
This commit is contained in:
97
Scenes/SingleBond.cs
Executable file
97
Scenes/SingleBond.cs
Executable file
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using Godot;
|
||||
using VirtualChemDemo.Concepts;
|
||||
|
||||
public partial class SingleBond : Bond2D
|
||||
{
|
||||
private static int BIndex(int index, int multi)
|
||||
{
|
||||
if (multi == 1)
|
||||
return 0;
|
||||
if (multi % 2 == 1)
|
||||
{
|
||||
int center = multi / 2 + 1;
|
||||
return center - index;
|
||||
}
|
||||
|
||||
if (multi % 2 == 0)
|
||||
{
|
||||
double center = multi / 2 + 0.5;
|
||||
return (int)(center > index ? Math.Ceiling(center - index) : Math.Floor(center - index));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
private void MakeCurve(float curveRate=20f, int cDir = 1)
|
||||
{
|
||||
Vector2 Start = AtomFrom.Position + new Vector2(32, 32);;
|
||||
Vector2 End = AtomTo.Position + new Vector2(32, 32);;
|
||||
Vector2[] xs = new Vector2[17];
|
||||
int[] x2 = new[] { 4, 12 };
|
||||
int[] x3 = new[] { 2, 6, 10, 14};
|
||||
int[] x4 = new[] { 1, 3, 5, 7, 9, 11, 13, 15 };
|
||||
Vector2 vd = End - Start;
|
||||
Vector2 nor = vd.Rotated(Mathf.Pi / 2 * cDir);
|
||||
Vector2 center = vd / 2 + 4f * nor / curveRate;
|
||||
xs[0] = Start;
|
||||
xs[16] = End;
|
||||
xs[8] = center + xs[0];
|
||||
foreach (int i in x2)
|
||||
{
|
||||
Vector2 v = xs[i + 4] - xs[i - 4];
|
||||
Vector2 n = v.Rotated(Mathf.Pi / 2 * cDir);
|
||||
Vector2 w = v / 2 + 2f * n / curveRate;
|
||||
xs[i] = w + xs[i - 4];
|
||||
}
|
||||
|
||||
foreach (int i in x3)
|
||||
{
|
||||
Vector2 v = xs[i + 2] - xs[i - 2];
|
||||
Vector2 n = v.Rotated(Mathf.Pi / 2 * cDir);
|
||||
Vector2 w = v / 2 + n / curveRate;
|
||||
xs[i] = w + xs[i - 2];
|
||||
}
|
||||
|
||||
foreach (int i in x4)
|
||||
{
|
||||
Vector2 v = xs[i + 1] - xs[i - 1];
|
||||
Vector2 n = v.Rotated(Mathf.Pi / 2 * cDir);
|
||||
Vector2 w = v / 2 + n / curveRate;
|
||||
xs[i] = w + xs[i - 1];
|
||||
}
|
||||
BondTypeA.Position = xs[10];
|
||||
BondTypeB.Position = xs[6];
|
||||
Points = xs;
|
||||
}
|
||||
|
||||
public override void BondUpdate()
|
||||
{
|
||||
Reindex();
|
||||
int bindex = BIndex(Index, Multi);
|
||||
if (bindex == 0)
|
||||
{
|
||||
Vector2 v1 = AtomFrom.Position + new Vector2(32, 32);
|
||||
Vector2 v2 = AtomTo.Position + new Vector2(32, 32);
|
||||
Vector2 m = (v1 + v2) / 2;
|
||||
Points = new[] { v1, m, v2 };
|
||||
BondTypeA.Position = m - new Vector2(10, 10);
|
||||
BondTypeB.Position = m + new Vector2(10, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
float curveRate = 25 - Math.Abs(bindex)*5;
|
||||
int cDir = bindex > 0 ? 1 : -1;
|
||||
MakeCurve(curveRate, cDir);
|
||||
}
|
||||
|
||||
|
||||
|
||||
BondTypeA.Text = BondFrom.BondType;
|
||||
BondTypeB.Text = BondTo.BondType;
|
||||
}
|
||||
|
||||
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user