用c++的remove_if写一个数组中所有线段元素中存在相交的线段的元素被移除,但要获取他们的交点存到一个新的数组
时间: 2024-03-13 11:47:29 浏览: 16
好的,我来为您解答这个问题。
首先,我们需要定义一个结构体来表示线段,包含起点和终点坐标:
```c++
struct Line {
int x1, y1, x2, y2; // 起点和终点坐标
};
```
接着,我们需要判断两条线段是否相交,可以使用叉积来判断:
```c++
// 判断两条线段是否相交
bool isIntersect(Line l1, Line l2) {
int c1 = cross(l2.x1-l1.x1, l2.y1-l1.y1, l1.x2-l1.x1, l1.y2-l1.y1);
int c2 = cross(l2.x2-l1.x1, l2.y2-l1.y1, l1.x2-l1.x1, l1.y2-l1.y1);
int c3 = cross(l1.x1-l2.x1, l1.y1-l2.y1, l2.x2-l2.x1, l2.y2-l2.y1);
int c4 = cross(l1.x2-l2.x1, l1.y2-l2.y1, l2.x2-l2.x1, l2.y2-l2.y1);
return (c1 * c2 < 0) && (c3 * c4 < 0);
}
// 计算叉积
int cross(int x1, int y1, int x2, int y2) {
return x1 * y2 - x2 * y1;
}
```
接下来,我们可以使用 `remove_if` 函数来移除所有相交的线段,并将它们的交点存储到一个新的数组中:
```c++
// 定义存储交点的结构体
struct Point {
int x, y;
};
// 移除相交线段,获取交点
void removeIntersect(Line* lines, int n, Line* result, int& m, Point* points, int& k) {
// 遍历所有线段,判断是否相交
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (isIntersect(lines[i], lines[j])) { // 如果相交
// 计算交点
Point p = {
cross(cross(lines[i].x1, lines[i].y1, lines[i].x2, lines[i].y2),
lines[i].x1 - lines[i].x2,
cross(lines[j].x1, lines[j].y1, lines[j].x2, lines[j].y2),
lines[j].x1 - lines[j].x2)
/ cross(lines[i].x1 - lines[i].x2, lines[i].y1 - lines[i].y2,
lines[j].x1 - lines[j].x2, lines[j].y1 - lines[j].y2),
cross(cross(lines[i].x1, lines[i].y1, lines[i].x2, lines[i].y2),
lines[i].y1 - lines[i].y2,
cross(lines[j].x1, lines[j].y1, lines[j].x2, lines[j].y2),
lines[j].y1 - lines[j].y2)
/ cross(lines[i].x1 - lines[i].x2, lines[i].y1 - lines[i].y2,
lines[j].x1 - lines[j].x2, lines[j].y1 - lines[j].y2)
};
// 将交点存储到数组中
points[k++] = p;
// 将相交的线段从原数组中移除
lines[i] = {0, 0, 0, 0};
lines[j] = {0, 0, 0, 0};
}
}
}
// 将不相交的线段存储到结果数组中
m = 0;
for (int i = 0; i < n; i++) {
if (lines[i].x1 != 0 || lines[i].y1 != 0 || lines[i].x2 != 0 || lines[i].y2 != 0) {
result[m++] = lines[i];
}
}
}
```
完整代码如下:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
// 定义存储线段的结构体
struct Line {
int x1, y1, x2, y2; // 起点和终点坐标
};
// 定义存储交点的结构体
struct Point {
int x, y;
};
// 判断两条线段是否相交
bool isIntersect(Line l1, Line l2) {
int c1 = cross(l2.x1-l1.x1, l2.y1-l1.y1, l1.x2-l1.x1, l1.y2-l1.y1);
int c2 = cross(l2.x2-l1.x1, l2.y2-l1.y1, l1.x2-l1.x1, l1.y2-l1.y1);
int c3 = cross(l1.x1-l2.x1, l1.y1-l2.y1, l2.x2-l2.x1, l2.y2-l2.y1);
int c4 = cross(l1.x2-l2.x1, l1.y2-l2.y1, l2.x2-l2.x1, l2.y2-l2.y1);
return (c1 * c2 < 0) && (c3 * c4 < 0);
}
// 计算叉积
int cross(int x1, int y1, int x2, int y2) {
return x1 * y2 - x2 * y1;
}
// 移除相交线段,获取交点
void removeIntersect(Line* lines, int n, Line* result, int& m, Point* points, int& k) {
// 遍历所有线段,判断是否相交
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (isIntersect(lines[i], lines[j])) { // 如果相交
// 计算交点
Point p = {
cross(cross(lines[i].x1, lines[i].y1, lines[i].x2, lines[i].y2),
lines[i].x1 - lines[i].x2,
cross(lines[j].x1, lines[j].y1, lines[j].x2, lines[j].y2),
lines[j].x1 - lines[j].x2)
/ cross(lines[i].x1 - lines[i].x2, lines[i].y1 - lines[i].y2,
lines[j].x1 - lines[j].x2, lines[j].y1 - lines[j].y2),
cross(cross(lines[i].x1, lines[i].y1, lines[i].x2, lines[i].y2),
lines[i].y1 - lines[i].y2,
cross(lines[j].x1, lines[j].y1, lines[j].x2, lines[j].y2),
lines[j].y1 - lines[j].y2)
/ cross(lines[i].x1 - lines[i].x2, lines[i].y1 - lines[i].y2,
lines[j].x1 - lines[j].x2, lines[j].y1 - lines[j].y2)
};
// 将交点存储到数组中
points[k++] = p;
// 将相交的线段从原数组中移除
lines[i] = {0, 0, 0, 0};
lines[j] = {0, 0, 0, 0};
}
}
}
// 将不相交的线段存储到结果数组中
m = 0;
for (int i = 0; i < n; i++) {
if (lines[i].x1 != 0 || lines[i].y1 != 0 || lines[i].x2 != 0 || lines[i].y2 != 0) {
result[m++] = lines[i];
}
}
}
int main() {
// 定义测试用例
Line lines[] = {
{0, 0, 1, 1},
{1, 0, 0, 1},
{0, 0, 0, 1},
{0, 1, 1, 1},
{1, 1, 1, 0},
{1, 0, 1, 1},
{0, 0, 1, 0},
{0, 0, 1, 1}
};
int n = sizeof(lines) / sizeof(lines[0]);
Line result[n];
int m;
Point points[n];
int k = 0;
// 移除相交线段,获取交点
removeIntersect(lines, n, result, m, points, k);
// 输出结果
cout << "相交线段已移除,不相交线段如下:" << endl;
for (int i = 0; i < m; i++) {
cout << "(" << result[i].x1 << "," << result[i].y1 << ") -> (" << result[i].x2 << "," << result[i].y2 << ")" << endl;
}
cout << "交点如下:" << endl;
for (int i = 0; i < k; i++) {
cout << "(" << points[i].x << "," << points[i].y << ")" << endl;
}
return 0;
}
```