Heroes_of_Hiis/Assets/Polaris - Low Poly Ecosystem/Polaris - Low Poly Terrain .../Runtime/Scripts/Utilities/GLine2D.cs

116 lines
3.2 KiB
C#

#if GRIFFIN
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using Unity.Mathematics;
using static Unity.Mathematics.math;
namespace Pinwheel.Griffin
{
public struct Line2D
{
public float2 startPoint;
public float2 endPoint;
public float2 Direction
{
get
{
return normalize(endPoint - startPoint);
}
}
public float Length
{
get
{
return distance(startPoint, endPoint);
}
}
public float SqrLength
{
get
{
return distancesq(startPoint, endPoint);
}
}
public Line2D(float2 start, float2 end)
{
startPoint = start;
endPoint = end;
}
public Line2D(float x1, float y1, float x2, float y2)
{
startPoint = new float2(x1, y1);
endPoint = new float2(x2, y2);
}
public float GetX(float y)
{
float2 dir = endPoint - startPoint;
float a = -dir.y;
float b = dir.x;
float c = -(a * startPoint.x + b * startPoint.y);
float x = (-b * y - c) / a;
return x;
}
public float GetY(float x)
{
float2 dir = endPoint - startPoint;
float a = -dir.y;
float b = dir.x;
float c = -(a * startPoint.x + b * startPoint.y);
float y = (-a * x - c) / b;
return y;
}
public static bool Intersect(Line2D l1, Line2D l2, out float2 point)
{
bool result = false;
float x1 = l1.startPoint.x;
float x2 = l1.endPoint.x;
float x3 = l2.startPoint.x;
float x4 = l2.endPoint.x;
float y1 = l1.startPoint.y;
float y2 = l1.endPoint.y;
float y3 = l2.startPoint.y;
float y4 = l2.endPoint.y;
float denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
if (denominator == 0)
{
point = new float2(0, 0);
result = false;
}
else
{
float xNumerator = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);
float yNumerator = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);
point = new float2(xNumerator / denominator, yNumerator / denominator);
float sqrLength1 = l1.SqrLength;
float sqrLength2 = l2.SqrLength;
if (distancesq(point, l1.startPoint) > sqrLength1 || distancesq(point, l1.endPoint) > sqrLength1)
{
result = false;
}
else if (distancesq(point, l2.startPoint) > sqrLength2 || distancesq(point, l2.endPoint) > sqrLength2)
{
result = false;
}
else
{
result = true;
}
}
return result;
}
}
}
#endif