116 lines
3.2 KiB
C#
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
|