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