资源简介
程序思路:
①:得到线段我们的线段集合S(本次项目鼠标点击得到线段(p1,p2两点)已经在ue4蓝图里面实现,这一步就不过多阐述)
②:移除孤立的线段(两端的点都是孤立的);
③:拆分所有的线段(就是将所有的相交线线段拆分开,得到新的线段集合S)
④:移除一个端点孤立的线段(一个端点孤立的线段是不构成多边形的)
⑤:找出所有的大区域线段集合M,M是线段集合的集合,二维数组;(这里的大区域指的是:以任意一条线为起点找到和它相交的其他线段,再找到和这些线段相交的其他线段,直到找不到相交线段,那么这些线段的集合就是一个大区域Mi。然后找完所有的大区域)
⑥:分别对每一个大区域进行封闭区域的提取。
代码片段和文件信息
// Fill out your copyright notice in the Description page of Project Settings.
#include “ProceduralMesh.h“
#include “getcrossfield.h“
bool Yellow_Crane_Tower::Be_equal_to(float A float B)
{
if (((A - B) < 0.1) && ((A - B) > -0.1))
{
return true;
}
else
{
return false;
}
}
bool Yellow_Crane_Tower::Be_equal_to(FVector A FVector B)
{
if (Be_equal_to(A.X B.X) && Be_equal_to(A.Y B.Y) && Be_equal_to(A.Z B.Z))
{
return true;
}
else
{
return false;
}
}
bool Yellow_Crane_Tower::isonline(FVector P1 FVector P2 FVector Q)//判断点是否在线上
{
if (Be_equal_to(Q P1) || Be_equal_to(Q P2))
{
return true;
}
if (Be_equal_to((Q - P1).Size() + (Q - P2).Size() (P1 - P2).Size()))
{
return true;
}
return false;
}
bool Yellow_Crane_Tower::doselinecross(Yellow_Crane_Tower::line L1 Yellow_Crane_Tower::line L2)//判断线段是否相交
{
float x1 = L1.p1.X;
float y1 = L1.p1.Y;
float x2 = L1.p2.X;
float y2 = L1.p2.Y;
float x3 = L2.p1.X;
float y3 = L2.p1.Y;
float x4 = L2.p2.X;
float y4 = L2.p2.Y;
if ((Be_equal_to(L1.p1 L2.p1) && Be_equal_to(L1.p2 L2.p2)) || (Be_equal_to(L1.p1 L2.p2) && Be_equal_to(L1.p2 L2.p1)))
{
return false;
}
if (Be_equal_to((x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4) 0.f) || Be_equal_to((y1 - y2) * (x3 - x4) - (x1 - x2) * (y3 - y4) 0.f))
{
if (Be_equal_to(L1.p1 L2.p1) || Be_equal_to(L1.p1 L2.p2) || Be_equal_to(L1.p2 L2.p1) || Be_equal_to(L1.p2 L2.p2))
{
return true;
}
else
{
return false;
}
}
float x = ((x1 - x2) * (x3 * y4 - x4 * y3) - (x3 - x4) * (x1 * y2 - x2 * y1)) / ((x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4));
float y = ((y1 - y2) * (x3 * y4 - x4 * y3) - (x1 * y2 - x2 * y1) * (y3 - y4)) / ((y1 - y2) * (x3 - x4) - (x1 - x2) * (y3 - y4));
FVector Q;
Q.X = x;
Q.Y = y;
Q.Z = L1.p1.Z;
if (isonline(L1.p1 L1.p2 Q) && isonline(L2.p1 L2.p2 Q))
{
return true;
}
else
{
return false;
}
}
FVector Yellow_Crane_Tower::getcrosspoint(Yellow_Crane_Tower::line L1 Yellow_Crane_Tower::line L2)
{
float x1 = L1.p1.X;
float y1 = L1.p1.Y;
float x2 = L1.p2.X;
float y2 = L1.p2.Y;
float x3 = L2.p1.X;
float y3 = L2.p1.Y;
float x4 = L2.p2.X;
float y4 = L2.p2.Y;
FVector Q;
Q.X = 0;
Q.Y = 0;
Q.Z = 0;
if (!doselinecross(L1 L2))
{
return Q;
}
if (Be_equal_to(L1.p1 L2.p1) || Be_equal_to(L1.p1 L2.p2))
{
return L1.p1;
}
if (Be_equal_to(L1.p2 L2.p1) || Be_equal_to(L1.p2 L2.p2))
{
return L1.p2;
}
float x = ((x1 - x2) * (x3 * y4 - x4 * y3) - (x3 - x4) * (x1 * y2 - x2 * y1)) / ((x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4));
float y = ((y1 - y2) * (x3 * y4 - x4 * y3) - (x1 * y2 - x2 * y1) * (y3 - y4)) / ((y1 - y2) * (x3 - x4) - (x1 - x2) * (y3 - y4));
Q.X = x;
Q.Y = y;
Q.Z = L1.p1.Z;
if (isonline(L1.p1 L1.p2 Q) && isonline(L2.p1 L2.p2 Q))
{
return Q;
}
else
{
Q.X = 0;
Q.Y = 0;
Q.Z = 0;
return Q;
}
}
TArray<
相关资源
- vs2013 c++串口助手源码
- c++21点游戏
- 蛮力法求解旅行商问题C++
- 理发师睡觉问题
- 常用的VC界面模板
- 20多个常用的Hash算法C++ 实现
- C++仿360新界面源代码
- 遗传、禁忌、模拟退火解背包问题
- C++语言程序设计 郑莉 第四版 课后题
- 蚁群算法C++版
- C++开发精灵对战小游戏
- C++与js相互调用
- 使用Qt做的数据管理系统
- c++测试题aaaa
- c++职工工资管理系统
- 分数计算器C++
- c++职工管理系统链表
- c++密度据类MFC可视化
- 电信计费系统C++
- c++ 最小二乘算法拟合球心 使用Vs200
- 感染EXE文件的VC++源码请谨慎使用.
- 仓库管理系统 c++
- C++生产者消费者问题
- 基于RFID门禁系统源码 C/C++
- 多国语言Demo源码 c++builder6编写
- C++ IOCP socket完成端口视频教程及源码
- 自学VC++2010;用ADO方法在ACCESS2010数据
- C++primer5
- vc++判断显示器是否支持多点触摸
- WPS、微软EXCEL通用C++接口表格通用C+
评论
共有 条评论