2026-06-05 13:44:39 +09:00

150 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VisionCommon {
public class MathUtil {
private const double DELTA_EQUALITY = 0.00000001;
public static double ConvertDegreeToRadian(double angle) {
return angle * (Math.PI / 180.0);
}
public static double ConvertRadianToDegree(double angle) {
return angle * (180.0 / Math.PI);
}
public static double CalculateDistance(DoublePoint p1, DoublePoint p2) {
var diff = p1 - p2;
return Math.Sqrt(Math.Pow(diff.X, 2) + Math.Pow(diff.Y, 2));
}
public static DoublePoint CalculateCenter(DoublePoint p1, DoublePoint p2) {
return (p1 + p2) / 2;
}
public static double ConvertUnitSecToMilli(double value) {
return value * 1000;
}
public static double ConvertUnitMilliToSec(double value) {
return value / 1000;
}
public static double ConvertUnitMilliToMicro(double value) {
return value * 1000;
}
public static double ConvertUnitMicroToMilli(double value) {
return value / 1000;
}
public static DoublePoint TranslateRotateScale(
DoublePoint point,
Angle angle, DoublePoint origin,
double scale,
DoublePoint translation) {
var translatedPoint = point + (translation / scale);
var rotatedPoint = Rotate(translatedPoint, angle, origin);
var scaledPoint = rotatedPoint * scale;
return scaledPoint;
}
public static DoublePoint TranslateRotateScale(
DoublePoint point,
Angle angle,
double scale,
DoublePoint translation) {
var translatedPoint = point + (translation / scale);
var rotatedPoint = Rotate(translatedPoint, angle);
var scaledPoint = rotatedPoint * scale;
return scaledPoint;
}
public static DoublePoint RotateTranslateScale(
DoublePoint point,
Angle angle, DoublePoint origin,
double scale,
DoublePoint translation) {
var rotatedPoint = Rotate(point, angle, origin);
var translatedPoint = rotatedPoint + (translation / scale);
var scaledPoint = translatedPoint * scale;
return scaledPoint;
}
public static DoublePoint ScaleRotate(
DoublePoint point,
Angle angle,
double scaleX,
double scaleY) {
var scaledPoint = DoublePoint.Transform(
point,
new TransformScaleTranslation() {
ScaleX = scaleX,
ScaleY = scaleY,
});
var rotatedPoint = Rotate(scaledPoint, angle);
return rotatedPoint;
}
public static List<DoublePoint> RotatePoints(List<DoublePoint> points, Angle angle, DoublePoint thetaOrigin) {
var rotatedPoints = new List<DoublePoint>();
foreach (var p in points) {
rotatedPoints.Add(Rotate(p, angle, thetaOrigin));
}
return rotatedPoints;
}
public static DoublePoint Rotate(DoublePoint point, Angle angle, DoublePoint origin) {
var rotatedPoint = RotateImpl(point - origin, angle);
return rotatedPoint + origin;
}
public static DoublePoint Rotate(DoublePoint point, Angle angle) {
return RotateImpl(point, angle);
}
public static DoublePoint RotateFlip(DoublePoint point, Angle angle, eFlipY flipY) {
var rotatedPoint = RotateImpl(point, angle);
rotatedPoint.Y *= (int)flipY;
return rotatedPoint;
}
private static DoublePoint RotateImpl(DoublePoint point, Angle angle) {
// Rotate point in Image Coordinate System
double cosVal = Math.Cos(angle.Radian);
double sinVal = Math.Sin(angle.Radian);
var rotatedPoint = point.Clone();
rotatedPoint.X = (point.X * cosVal) - (point.Y * sinVal);
rotatedPoint.Y = (point.X * sinVal) + (point.Y * cosVal);
return rotatedPoint;
}
public static Angle GetLineAngle(DoublePoint p1, DoublePoint p2) {
var diff = p2 - p1;
double angleRad = Math.Atan2(diff.Y, diff.X);
return Angle.CreateWithRadian(angleRad);
}
public static bool Equals(double d1, double d2, double deltaEquality = DELTA_EQUALITY) {
if (Math.Abs(d1 - d2) > deltaEquality) {
return false;
}
return true;
}
}
}