找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 147|回复: 0

C++ UE4 将凸多边形通过最优解拆分为多个三角形

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-2 20:51:12 | 显示全部楼层 |阅读模式
  1. //        计算凸多边形的最优三角形切分
  2. void MinWeightTriangulation(const TArray<FVector>& arr, TArray<int>& ArrTriangle)
  3. {
  4.         if (arr.Num() < 3)
  5.                 return;
  6.         float** t = new float* [arr.Num()];
  7.         int** s = new int* [arr.Num()];
  8.         memset(t, 0, sizeof(float*) * arr.Num());
  9.         memset(s, 0, sizeof(int*) * arr.Num());
  10.         for (int idx = 0; idx < arr.Num(); idx++)
  11.         {
  12.                 t[idx] = new float[arr.Num()];
  13.                 s[idx] = new int[arr.Num()];
  14.                 memset(t[idx], 0, sizeof(float) * arr.Num());
  15.                 memset(s[idx], 0, sizeof(int) * arr.Num());
  16.         }
  17.         int j;
  18.         for (int len = 2; len <= arr.Num() - 1; len++)
  19.         {
  20.                 for (int i = 1; i <= arr.Num() - len; i++)
  21.                 {
  22.                         j = i + len - 1;
  23.                         t[i][j] = 0xFFFFFFF;
  24.                         for (int k = i; k <= j - 1; k++)
  25.                         {
  26.                                 float q = t[i][k] + t[k + 1][j] + calweight(arr[i - 1], arr[k], arr[j]);
  27.                                 if (q < t[i][j])
  28.                                 {
  29.                                         t[i][j] = q;
  30.                                         s[i][j] = k;
  31.                                 }
  32.                         }
  33.                 }
  34.         }
  35.         outTringle(1, arr.Num() - 1, s, ArrTriangle);
  36.         for (int idx = 0; idx < arr.Num(); idx++)
  37.         {
  38.                 delete[] t[idx];
  39.                 delete[] s[idx];
  40.         }
  41.         delete t;
  42.         delete s;
  43. }
  44. float calweight(FVector a, FVector b, FVector c)
  45. {
  46.         float x = (a - b).SizeSquared2D();
  47.         float y = (a - c).SizeSquared2D();
  48.         float z = (b - c).SizeSquared2D();
  49.         return x + y + z;
  50. }
  51. void outTringle(int i, int j, int** s, TArray<int>& trignles)
  52. {
  53.         if (i == j)
  54.                 return;
  55.         outTringle(i, s[i][j], s, trignles);
  56.         outTringle(s[i][j] + 1, j, s, trignles);
  57.         trignles.Add(i - 1);
  58.         trignles.Add(s[i][j]);
  59.         trignles.Add(j);
  60. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 14:59 , Processed in 0.131888 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表