天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 70|回复: 0

多边形扩展算法

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
多边形扩展算法[code]c++语言。



//Point2D 的类定义,也包括运算符重构

class Point2D  {

public:
float x;
float y;

    Point2D()
{
  x=0;y=0;
}

Point2D(float x, float y)
{
  this->x=x;this->y=y;
}

friend Point2D operator +(Point2D a, Point2D b)
{
  Point2D p;
  p.x=a.x+b.x;
  p.y=a.y+b.y;
  return p;
};

friend Point2D operator -(Point2D a, Point2D b)
{
  Point2D p;
  p.x=a.x-b.x;
  p.y=a.y-b.y;
  return p;
};

friend float operator *(Point2D a, Point2D b)
{
  float p=a.x*b.x+a.y*b.y;
  return p;
};

friend Point2D operator *(Point2D a, float value)
{
  Point2D p;
  p.x=a.x*value;
  p.y=a.y*value;
  return p;
};

friend float xlJi(Point2D a, Point2D b)
{
  float p=((a.x)*(b.y))-((a.y)*(b.x));
  return p;
};

};


//测试程序

int main()

{
std::vector<Point2D> pList;
std::vector<Point2D> DpList;
std::vector<Point2D> nDpList;
std::vector<Point2D> newList;

Point2D  p2d,p2;
//p2d.x=0;p2d.y=0;pList.push_back(p2d);
//p2d.x=0;p2d.y=100;pList.push_back(p2d);
//p2d.x=100;p2d.y=100;pList.push_back(p2d);
//p2d.x=50;p2d.y=50;pList.push_back(p2d);
//p2d.x=100;p2d.y=0;pList.push_back(p2d);
//--注释的是原文数据,我这里把数据的顺序反了一下
p2d.x=0;p2d.y=0;pList.push_back(p2d);
p2d.x=100;p2d.y=0;pList.push_back(p2d);
p2d.x=50;p2d.y=50;pList.push_back(p2d);
p2d.x=100;p2d.y=100;pList.push_back(p2d);
p2d.x=0;p2d.y=100;pList.push_back(p2d);



//-------------------------------------------

int i,index,count;
count=pList.size();
for(i=0;i<count;i++)
{
  index=(i+1)%count;
  p2d=pList[index]-pList[i];
  DpList.push_back(p2d);
}
// 初始化ndpList,单位化两顶点向量差
float r;
for(i=0;i<count;i++)
{
  r=sqrt(DpList[i]*DpList[i]);
  r=1/r;
  p2d=DpList[i]*r;
  nDpList.push_back(p2d);
}


// 计算新顶点, 注意参数dist为负是向内收缩, 为正是向外扩张
//上述说法只是对于顺时针而言
//我把数据改为逆时针,结论刚好相反
float lenth;
float dist=5;
int startindex,endindex;
for(i=0;i<count;i++)
{
  startindex= i==0?count-1:i-1;
  endindex=i;
  float sina=xlJi(nDpList[startindex],nDpList[endindex]);
  lenth=dist/sina;
  p2d=nDpList[endindex]-nDpList[startindex];
  p2=pList[i]+p2d*lenth;
  newList.push_back(p2);
  TRACE(" %.1f,%.1f\n",p2.x,p2.y);
}

return 0;
}

原文链接:https://blog.csdn.net/leon_zeng0/article/details/73500174[/code]

 

 

 

 

多边形扩展算法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:36 , Processed in 0.133966 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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