63 lines
2.5 KiB
C#
63 lines
2.5 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace NWH.DWP2
|
|
{
|
|
public static class GeometryUtils
|
|
{
|
|
public static Vector3 CalculateCentroid(Vector3 pointA, Vector3 pointB, Vector3 pointC, Vector3 pointD)
|
|
{
|
|
Vector3 centroid = (pointA + pointB + pointC + pointD) / 4;
|
|
return centroid;
|
|
}
|
|
|
|
public static float CalculateQuadrilateralArea(Vector3 pointA, Vector3 pointB, Vector3 pointC, Vector3 pointD)
|
|
{
|
|
// Calculate the area of the first triangle (pointA, pointB, pointC)
|
|
float areaTriangle1 = CalculateTriangleArea(pointA, pointB, pointC);
|
|
|
|
// Calculate the area of the second triangle (pointA, pointC, pointD)
|
|
float areaTriangle2 = CalculateTriangleArea(pointA, pointC, pointD);
|
|
|
|
// Return the sum of both triangle areas
|
|
return areaTriangle1 + areaTriangle2;
|
|
}
|
|
|
|
public static float CalculateTriangleArea(Vector3 pointA, Vector3 pointB, Vector3 pointC)
|
|
{
|
|
Vector3 vectorAB = pointB - pointA;
|
|
Vector3 vectorAC = pointC - pointA;
|
|
|
|
// Calculate the cross product of vectorAB and vectorAC
|
|
Vector3 crossProduct = Vector3.Cross(vectorAB, vectorAC);
|
|
|
|
// Calculate the magnitude of the cross product and divide by 2 to get the area
|
|
return crossProduct.magnitude / 2;
|
|
}
|
|
|
|
public static Vector3 CalculateSurfaceWeightedCenter(Vector3 pointA, Vector3 pointB, Vector3 pointC, Vector3 pointD)
|
|
{
|
|
// Calculate the area and centroid of the first triangle (pointA, pointB, pointC)
|
|
float areaTriangle1 = CalculateTriangleArea(pointA, pointB, pointC);
|
|
Vector3 centroidTriangle1 = CalculateCentroid(pointA, pointB, pointC);
|
|
|
|
// Calculate the area and centroid of the second triangle (pointA, pointC, pointD)
|
|
float areaTriangle2 = CalculateTriangleArea(pointA, pointC, pointD);
|
|
Vector3 centroidTriangle2 = CalculateCentroid(pointA, pointC, pointD);
|
|
|
|
// Calculate the surface-weighted center
|
|
float totalArea = areaTriangle1 + areaTriangle2;
|
|
Vector3 surfaceWeightedCenter = (centroidTriangle1 * areaTriangle1 + centroidTriangle2 * areaTriangle2) / totalArea;
|
|
|
|
return surfaceWeightedCenter;
|
|
}
|
|
|
|
private static Vector3 CalculateCentroid(Vector3 pointA, Vector3 pointB, Vector3 pointC)
|
|
{
|
|
return (pointA + pointB + pointC) / 3;
|
|
}
|
|
}
|
|
}
|
|
|