资源简介
程序思路:
①:得到线段我们的线段集合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<
相关资源
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
评论
共有 条评论