From 27fc91fbe8f88b6885356e68828cfe1ce1db7601 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期三, 28 二月 2024 09:53:13 +0800
Subject: [PATCH] 坐标
---
lib/src/main/cpp/test_common/Geometry.cpp | 174 ++++++++++++++++++++++++++++-----------------------------
1 files changed, 86 insertions(+), 88 deletions(-)
diff --git a/lib/src/main/cpp/test_common/Geometry.cpp b/lib/src/main/cpp/test_common/Geometry.cpp
index 8fe70d1..c6bd694 100644
--- a/lib/src/main/cpp/test_common/Geometry.cpp
+++ b/lib/src/main/cpp/test_common/Geometry.cpp
@@ -43,15 +43,13 @@
return (radians * 180.0) / M_PI;
}
-void MakeLine(Line *line, const PointF *p1, const PointF *p2)
+void MAKE_LINE(Line &a, PointF &b, PointF &c)
{
- line->X1 = p1->X;
- line->Y1 = p1->Y;
- line->X2 = p2->X;
- line->Y2 = p2->Y;
+ a.p1 = b;
+ a.p2 = c;
}
-void MakePolygon(Polygon *polygon, std::initializer_list<PointF> point_set)
+/*void MakePolygon(Polygon *polygon, std::initializer_list<PointF> point_set)
{
int n = 0;
@@ -61,12 +59,12 @@
polygon->point[n++] = ptr;
}
polygon->num = n;
-}
+}*/
void MakeHidePoint(PointF *point, const PointF *bp, const Line *bl)
{
- point->X = (bl->X1 + bl->X2) - bp->X;
- point->Y = (bl->Y1 + bl->Y2) - bp->Y;
+ point->X = (bl->p1.X + bl->p2.X) - bp->X;
+ point->Y = (bl->p1.Y + bl->p2.Y) - bp->Y;
}
void CleanPolygon(Polygon *polygon)
@@ -127,13 +125,13 @@
int index2 = (index + 1) % polygon->num;
Line line2;
- line2.X1 = polygon->point[index].X;
- line2.Y1 = polygon->point[index].Y;
- line2.X2 = polygon->point[index2].X;
- line2.Y2 = polygon->point[index2].Y;
+ line2.p1.X = polygon->point[index].X;
+ line2.p1.Y = polygon->point[index].Y;
+ line2.p2.X = polygon->point[index2].X;
+ line2.p2.Y = polygon->point[index2].Y;
-// LOGD("line1(%d %d - %d %d) line2(%d %d - %d %d)", line.X1, line.Y1, line.X2, line.Y2,
-// line2.X1, line2.Y1, line2.X2, line2.Y2);
+// LOGD("line1(%d %d - %d %d) line2(%d %d - %d %d)", line.p1.X, line.p1.Y, line.p2.X, line.p2.Y,
+// line2.p1.X, line2.p1.Y, line2.p2.X, line2.p2.Y);
relation_t relation = IntersectionOf(line, line2);
@@ -149,8 +147,8 @@
PointF point2;
- point2.X = line.X1;
- point2.Y = line.Y1;
+ point2.X = line.p1.X;
+ point2.Y = line.p1.Y;
return tangent ? GM_Tangent : IntersectionOf(point2, polygon);
}
@@ -172,10 +170,10 @@
case 2: {
Line line2;
- line2.X1 = polygon->point[0].X;
- line2.Y1 = polygon->point[0].Y;
- line2.X2 = polygon->point[1].X;
- line2.Y2 = polygon->point[1].Y;
+ line2.p1.X = polygon->point[0].X;
+ line2.p1.Y = polygon->point[0].Y;
+ line2.p2.X = polygon->point[1].X;
+ line2.p2.Y = polygon->point[1].Y;
return IntersectionOf(point, line2);
}
default:
@@ -224,21 +222,21 @@
relation_t IntersectionOf(PointF point, Line line)
{
- double bottomY = fmin(line.Y1, line.Y2);
- double topY = fmax(line.Y1, line.Y2);
+ double bottomY = fmin(line.p1.Y, line.p2.Y);
+ double topY = fmax(line.p1.Y, line.p2.Y);
bool heightIsRight = point.Y >= bottomY &&
point.Y <= topY;
//Vertical line, slope is divideByZero error!
- if (isEqual(line.X1, line.X2)) {
- if (isEqual(point.X, line.X1) && heightIsRight) {
+ if (isEqual(line.p1.X, line.p2.X)) {
+ if (isEqual(point.X, line.p1.X) && heightIsRight) {
return GM_Tangent;
} else {
return GM_None;
}
}
- double slope = (line.X2 - line.X1) / (line.Y2 - line.Y1);
- bool onLine = isEqual(line.Y1 - point.Y, slope * (line.X1 - point.X));
+ double slope = (line.p2.X - line.p1.X) / (line.p2.Y - line.p1.Y);
+ bool onLine = isEqual(line.p1.Y - point.Y, slope * (line.p1.X - point.X));
if (onLine && heightIsRight) {
return GM_Tangent;
@@ -250,41 +248,41 @@
relation_t IntersectionOf(Line line1, Line line2)
{
// Fail if either line segment is zero-length.
- if ((isEqual(line1.X1, line1.X2) && isEqual(line1.Y1, line1.Y2)) || (isEqual(line2.X1, line2.X2) && isEqual(line2.Y1, line2.Y2)))
+ if ((isEqual(line1.p1.X, line1.p2.X) && isEqual(line1.p1.Y, line1.p2.Y)) || (isEqual(line2.p1.X, line2.p2.X) && isEqual(line2.p1.Y, line2.p2.Y)))
return GM_None;
- if ((isEqual(line1.X1, line2.X1) && isEqual(line1.Y1, line2.Y1)) || (isEqual(line1.X2, line2.X1) && isEqual(line1.Y2, line2.Y1)))
+ if ((isEqual(line1.p1.X, line2.p1.X) && isEqual(line1.p1.Y, line2.p1.Y)) || (isEqual(line1.p2.X, line2.p1.X) && isEqual(line1.p2.Y, line2.p1.Y)))
return GM_Intersection;
- if ((isEqual(line1.X1, line2.X2) && isEqual(line1.Y1, line2.Y2)) || (isEqual(line1.X2, line2.X2) && isEqual(line1.Y2, line2.Y2)))
+ if ((isEqual(line1.p1.X, line2.p2.X) && isEqual(line1.p1.Y, line2.p2.Y)) || (isEqual(line1.p2.X, line2.p2.X) && isEqual(line1.p2.Y, line2.p2.Y)))
return GM_Intersection;
// (1) Translate the system so that point A is on the origin.
- line1.X2 -= line1.X1; line1.Y2 -= line1.Y1;
- line2.X1 -= line1.X1; line2.Y1 -= line1.Y1;
- line2.X2 -= line1.X1; line2.Y2 -= line1.Y1;
+ line1.p2.X -= line1.p1.X; line1.p2.Y -= line1.p1.Y;
+ line2.p1.X -= line1.p1.X; line2.p1.Y -= line1.p1.Y;
+ line2.p2.X -= line1.p1.X; line2.p2.Y -= line1.p1.Y;
// Discover the length of segment A-B.
- double distAB = sqrt(line1.X2 * line1.X2 + line1.Y2 * line1.Y2);
+ double distAB = sqrt(line1.p2.X * line1.p2.X + line1.p2.Y * line1.p2.Y);
// (2) Rotate the system so that point B is on the positive X axis.
- double theCos = line1.X2 / distAB;
- double theSin = line1.Y2 / distAB;
- double newX = line2.X1 * theCos + line2.Y1 * theSin;
+ double theCos = line1.p2.X / distAB;
+ double theSin = line1.p2.Y / distAB;
+ double newX = line2.p1.X * theCos + line2.p1.Y * theSin;
- line2.Y1 = line2.Y1 * theCos - line2.X1 * theSin;
- line2.X1 = newX;
- newX = line2.X2 * theCos + line2.Y2 * theSin;
- line2.Y2 = line2.Y2 * theCos - line2.X2 * theSin;
- line2.X2 = newX;
+ line2.p1.Y = line2.p1.Y * theCos - line2.p1.X * theSin;
+ line2.p1.X = newX;
+ newX = line2.p2.X * theCos + line2.p2.Y * theSin;
+ line2.p2.Y = line2.p2.Y * theCos - line2.p2.X * theSin;
+ line2.p2.X = newX;
// Fail if segment C-D doesn't cross line A-B.
- if ((line2.Y1 < 0 && line2.Y2 < 0) || (line2.Y1 >= 0 && line2.Y2 >= 0)) {
+ if ((line2.p1.Y < 0 && line2.p2.Y < 0) || (line2.p1.Y >= 0 && line2.p2.Y >= 0)) {
return GM_None;
}
// (3) Discover the position of the intersection point along line A-B.
- double posAB = line2.X2 + (line2.X1 - line2.X2) * line2.Y2 / (line2.Y2 - line2.Y1);
+ double posAB = line2.p2.X + (line2.p1.X - line2.p2.X) * line2.p2.Y / (line2.p2.Y - line2.p1.Y);
// Fail if segment C-D crosses line A-B outside of segment A-B.
if (posAB < 0 || posAB > distAB) {
@@ -301,19 +299,19 @@
double DistanceOf(PointF point, Line line)
{
-// float a = sqrt((point.X-line.X1)*(point.X-line.X1) + (point.Y-line.Y1)*(point.Y-line.Y1));
-// float b = sqrt((point.X-line.X2)*(point.X-line.X2) + (point.Y-line.Y2)*(point.Y-line.Y2));
- double c = sqrt((line.X1-line.X2)*(line.X1-line.X2) + (line.Y1-line.Y2)*(line.Y1-line.Y2));
+// float a = sqrt((point.X-line.p1.X)*(point.X-line.p1.X) + (point.Y-line.p1.Y)*(point.Y-line.p1.Y));
+// float b = sqrt((point.X-line.p2.X)*(point.X-line.p2.X) + (point.Y-line.p2.Y)*(point.Y-line.p2.Y));
+ double c = sqrt((line.p1.X-line.p2.X)*(line.p1.X-line.p2.X) + (line.p1.Y-line.p2.Y)*(line.p1.Y-line.p2.Y));
// float p = (a+b+c)/2;
// dis = 2 * sqrt(p*(p-a)*(p-b)*(p-c)) / c;
- return fabs(point.X*line.Y1 + point.Y*line.X2 + line.X1*line.Y2 - line.X2*line.Y1 - line.X1*point.Y - point.X*line.Y2) / c;
+ return fabs(point.X*line.p1.Y + point.Y*line.p2.X + line.p1.X*line.p2.Y - line.p2.X*line.p1.Y - line.p1.X*point.Y - point.X*line.p2.Y) / c;
}
/*********************************************************
- * p1----------->p2 绾跨鍜孻杞寸殑澶硅
+ * p1----------->p2 绾跨鍜孻杞寸殑澶硅(椤烘椂閽�)
* @param p1
* @param p2
* @return yaw
@@ -361,13 +359,13 @@
double YawOf(Line &line)
{
PointF p1 = {
- .X = line.X1,
- .Y = line.Y1
+ .X = line.p1.X,
+ .Y = line.p1.Y
};
PointF p2 = {
- .X = line.X2,
- .Y = line.Y2
+ .X = line.p2.X,
+ .Y = line.p2.Y
};
return YawOf(p1, p2);
@@ -383,20 +381,20 @@
*/
double AngleOf(PointF p1, PointF p2, PointF p3)
{
- int rel = IntersectionOfLine(p1, p2, p3);
+ relational_position_t rel = IntersectionOfLine(p1, p2, p3);
switch (rel) {
- case RELATION_LEFT:
- case RELATION_RIGHT: {
+ case REL_POS_LEFT:
+ case REL_POS_RIGHT: {
double a = DistanceOf(p2, p3);
double b = DistanceOf(p1, p2);
double c = DistanceOf(p1, p3);
double deg = toDegree(acos((pow(b, 2) + pow(c, 2) - pow(a, 2)) / (2 * b * c)));
- return (rel == RELATION_LEFT) ? deg : (360-deg);
+ return (rel == REL_POS_LEFT) ? deg : (360-deg);
}
- case RELATION_BACK:
+ case REL_POS_REAR:
return 180;
default:
return 0;
@@ -413,9 +411,9 @@
*/
double AngleOfTowLine(Line base, Line dest)
{
- PointF p1 = {.X = base.X1, .Y = base.Y1};
- PointF p2 = {.X = base.X2, .Y = base.Y2};
- PointF p3 = {.X = dest.X2 + (base.X1 - dest.X1), .Y = dest.Y2 + (base.Y1 - dest.Y1)};
+ PointF p1 = {.X = base.p1.X, .Y = base.p1.Y};
+ PointF p2 = {.X = base.p2.X, .Y = base.p2.Y};
+ PointF p3 = {.X = dest.p2.X + (base.p1.X - dest.p1.X), .Y = dest.p2.Y + (base.p1.Y - dest.p1.Y)};
return AngleOf(p1, p2, p3);
}
@@ -443,15 +441,15 @@
{
double angle = 0;
- double dx = base.X2 - dest.X2;
- double dy = base.Y2 - dest.Y2;
+ double dx = base.p2.X - dest.p2.X;
+ double dy = base.p2.Y - dest.p2.Y;
- dest.X1 += dx;
- dest.Y1 += dy;
+ dest.p1.X += dx;
+ dest.p1.Y += dy;
- double c2 = pow((dest.X1 - base.X1), 2) + pow((dest.Y1 - base.Y1), 2);
- double a2 = pow((base.X1 - base.X2), 2) + pow((base.Y1 - base.Y2), 2);
- double b2 = pow((dest.X1 - base.X2), 2) + pow((dest.Y1 - base.Y2), 2);
+ double c2 = pow((dest.p1.X - base.p1.X), 2) + pow((dest.p1.Y - base.p1.Y), 2);
+ double a2 = pow((base.p1.X - base.p2.X), 2) + pow((base.p1.Y - base.p2.Y), 2);
+ double b2 = pow((dest.p1.X - base.p2.X), 2) + pow((dest.p1.Y - base.p2.Y), 2);
angle = acos((a2 + b2 - c2) / (2 * sqrt(a2) * sqrt(b2)));
@@ -535,10 +533,10 @@
{
PointF p1, p2;
- p1.X = line.X1;
- p1.Y = line.Y1;
- p2.X = line.X2;
- p2.Y = line.Y2;
+ p1.X = line.p1.X;
+ p1.Y = line.p1.Y;
+ p2.X = line.p2.X;
+ p2.Y = line.p2.Y;
return IntersectionOfLine(p1, p2, p);
}
@@ -588,11 +586,11 @@
{
PointF p1, p2;
- p1.X = line.X1;
- p1.Y = line.Y1;
+ p1.X = line.p1.X;
+ p1.Y = line.p1.Y;
- p2.X = line.X2;
- p2.Y = line.Y2;
+ p2.X = line.p2.X;
+ p2.Y = line.p2.Y;
PointF pv = GetVerticalPoint(p1, p2, point);
@@ -607,11 +605,11 @@
{
PointF p1, p2;
- p1.X = line.X1;
- p1.Y = line.Y1;
+ p1.X = line.p1.X;
+ p1.Y = line.p1.Y;
- p2.X = line.X2;
- p2.Y = line.Y2;
+ p2.X = line.p2.X;
+ p2.Y = line.p2.Y;
PointF pv = GetVerticalPoint(p1, p2, point);
vp = pv;
@@ -625,7 +623,7 @@
/****************************************************************
* p3
- * | 'L'
+ * | 'length'
* |
* p1------------------>p2
* |
@@ -633,11 +631,11 @@
* p3
* @param p1
* @param p2
- * @param L
+ * @param length
* @param dir
* @return
*/
-PointF Calc3Point(PointF p1, PointF p2, double L, char dir)
+PointF Calc3Point(PointF p1, PointF p2, double length, char dir)
{
PointF p3;
@@ -649,18 +647,18 @@
if (isEqual(p1.X, p2.X)) {
p3.Y = p2.Y;
if (p2.Y > p1.Y) {
- p3.X = p2.X + ((dir == 'L')? -L:L);
+ p3.X = p2.X + ((dir == 'L') ? -length : length);
} else {
- p3.X = p2.X + ((dir=='L')?L:-L);
+ p3.X = p2.X + ((dir=='L') ? length : -length);
}
return p3;
}
if (isEqual(p1.Y, p2.Y)) {
p3.X = p2.X;
if (p2.X > p1.X) {
- p3.Y = p2.Y + ((dir == 'L')? L:-L);
+ p3.Y = p2.Y + ((dir == 'L') ? length : -length);
} else {
- p3.Y = p2.Y + ((dir == 'L')? -L:L);
+ p3.Y = p2.Y + ((dir == 'L') ? -length : length);
}
return p3;
}
@@ -670,7 +668,7 @@
double A = 1 + pow(k, 2);
double B = 2*k*(b - p2.Y) - 2*p2.X;
- double C = pow(b - p2.Y, 2) + pow(p2.X, 2) - pow(L,2);
+ double C = pow(b - p2.Y, 2) + pow(p2.X, 2) - pow(length, 2);
double x3, y3;
--
Gitblit v1.8.0