• 大小: 25KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-12
  • 语言: C/C++
  • 标签: c++  ue4  封闭区域  

资源简介

程序思路: ①:得到线段我们的线段集合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<

评论

共有 条评论