多边形等距缩放算法 -- 计算几何

叉乘应用:判断多边形凹凸
P × Q
①若结果为正,则P在Q的顺时针方向;
②若结果为负,则P在Q的逆时针方向;
③若结果为零,则P与Q共线,也就是平行,可能同向可能反向

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;

int main() {
	double px[100],py[100];
	double ax[100],ay[100];
	double ex;
	int n;
	cin >> n;
	for(int i = 0; i < n; ++i) {
		cin >> px[i] >> py[i];
	}
	cin >> ex; //ex为正则放大,为负则缩小;
	for(int i = 0; i < n; ++i) {
		double v1x = px[i==0?n-1:i-1] - px[i],
		    v1y = py[i==0?n-1:i-1] - py[i];
		double v2x = px[i==n-1?0:i+1] - px[i],
		    v2y = py[i==n-1?0:i+1] - py[i];
		double no1 = sqrt(v1x * v1x + v1y * v1y);
		double no2 = sqrt(v2x * v2x + v2y * v2y);
		//double s1 = v1y / no1,s2 = v2y / no2;
		//cout << "sin1 : " <<s1 << " ; "<<"sin2 : " <<s2<<endl;
		double judge = v1x * v2y - v2x * v1y;
		//cout << "judge: "<< judge <<endl;
		v1x /= no1; v1y /= no1;
		v2x /= no2; v2y /= no2;
		//double cos = (v1x * v2x + v1y * v2y) / (no1 * no2);
		//cout << "cos : " << cos <<endl;
		double l = -ex/sqrt((1 - (v1x * v2x + v1y * v2y)) / 2);
		if(judge > 0) l = -l;
		ax[i] = v1x + v2x;
		ay[i] = v1y + v2y;
		l /= sqrt(ax[i] * ax[i] + ay[i] * ay[i]);
		ax[i] *= l; ay[i] *= l;
		ax[i] += px[i]; ay[i] += py[i];
	}
	for(int i = 0; i < n; ++i) {
		cout << "("<<ax[i]<<" , "<<ay[i]<<")"<<endl;
	}
	return 0;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 临界多边形算法(NFP)是一种在计算机图形学中常用的算法,用于生成多边形的非自交叠合轮廓。NFP最常被应用于计算凸多边形的内部和外部边界。该算法的计算过程也较为简单。 首先,给定一个多边形P以及正整数n,表示P的第n个边。通过选取边P[n]和整个多边形P的其余部分作为输入,NFP算法会生成与边P[n]相切的、最大面积的多边形,并且确保该多边形完全包含在P的边界之内。该多边形被称为P的n次临界多边形。 接下来,为了计算n的临界多边形,NFP算法会进行以下步骤:首先,将P的宽度扩大到比原来大得多的一个因子S倍,这样做的目的是为了更好地控制接下来的计算。然后,NFP算法会查找与P的每个边相切的直线,并计算出与该直线相交的区域的面积。最后,NFP算法将选择面积最大的区域作为边P[n]的临界多边形。 NFP算法的时间复杂度较低,因此在计算机图形学领域被广泛应用。NFP算法可以用于计算不同多边形之间的相交关系,以及计算多边形的几何特征,如面积、周长等。此外,NFP算法还可以用于生成新的几何形状,如多边形缩放变换等。 综上所述,NFP算法是一种用于计算多边形之间关系和几何特征的简单且高效的算法,它在计算机图形学中具有重要的应用价值。 ### 回答2: 临界多边形算法(NFP)是一种计算两个多边形间最小距离和相交区域的算法,常用于计算机图形学中的碰撞检测和布局优化等领域。 NFP算法主要分为两个步骤。首先,需要将两个多边形的顶点进行排序和标记。在排序过程中,通过判断每个顶点和另一个多边形的边是否有交点,可以确定顶点的位置关系。标记则是用来记录每个顶点在排序过程中的状态,标记方法常用有0、1和2三种,分别表示该顶点在多边形外部、边界上和内部。排序和标记完成后,就可以开始计算最小距离和相交区域了。 接下来是计算最小距离。通过比较两个多边形在排序后的顶点之间的距离,找出两个多边形间的最小距离。在计算过程中,会考虑到多边形间的边界情况,以确保计算的结果正确。 最后是计算相交区域。相交区域可以通过判断多边形的顶点状态和多边形间的交点来确定。根据顶点状态的不同,可以将相交区域分为内部区域、外部区域和边界区域。通过计算每个顶点在相交区域中的位置,可以得到相交区域的形状和大小。 总的来说,NFP算法是一种有效计算两个多边形间最小距离和相交区域的算法。通过排序、标记和计算,可以快速得到准确的结果。在实际应用中,NFP算法可以用于碰撞检测、布局优化和路径规划等领域,具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值