如何计算多边形顶点间的夹角?MATLAB实现方案咨询
MATLAB 随机多边形顶点夹角计算求助
我目前欠缺MATLAB代码相关知识,不知道该如何计算随机多边形顶点之间的夹角。
以下是我使用polyshape()函数加载并绘制多边形的代码,x、y坐标值从txt文件中读取加载:
loadpoly.m 代码
[filename,~] = uigetfile('*.txt', 'Load data from txt file'); if filename~=0 X_Y_Val = dlmread(filename, ' '); end X = X_Y_Val(:,1); Y = X_Y_Val(:,2); polygon = polyshape(X, Y); plot(polygon)
测试数据 Randompolygon.txt
0.29218 0.17609 0.56518 0.27635 0.69555 0.16324 0.83819 0.49486 0.62653 0.63882 0.27684 0.49743
我的目标是计算下图中红色标记标注的顶点角度,求正确的实现方向:
解决方案
可以通过向量点积的方法计算任意多边形顶点的内角,MATLAB也提供了直接针对polyshape对象的相关接口,两种实现方案如下:
方案1:调用内置接口直接计算(适合R2018a及以上版本)
直接用polyshape配套的向量运算方法推导内角,代码追加到你现有代码末尾即可:
% 获取多边形顶点坐标 verts = polygon.Vertices; n_verts = size(verts, 1); % 计算每个顶点相邻的两条边向量 v_prev = verts - verts([n_verts, 1:n_verts-1], :); v_next = verts([2:n_verts, 1], :) - verts; % 用点积计算内角,弧度转角度 dot_prod = sum(v_prev .* v_next, 2); norm_prod = vecnorm(v_prev, 2, 2) .* vecnorm(v_next, 2, 2); angles_rad = acos(max(-1, min(1, dot_prod ./ norm_prod))); angles_deg = rad2deg(angles_rad); % 输出所有顶点内角 disp('各顶点内角(单位:度):'); disp(angles_deg);
你可以根据红色标记的顶点索引,直接取angles_deg对应位置的数值即可。
方案2:手动遍历计算(兼容所有MATLAB版本)
如果你的MATLAB版本较低没有vecnorm这类内置函数,可以用循环逐个计算每个顶点的角度:
verts = polygon.Vertices; n_verts = size(verts, 1); angles_deg = zeros(n_verts, 1); for i = 1:n_verts % 取当前顶点、前后相邻顶点的坐标 p_prev = verts(mod(i-2, n_verts)+1, :); p_curr = verts(i, :); p_next = verts(mod(i, n_verts)+1, :); % 计算两条边的向量 vec1 = p_prev - p_curr; vec2 = p_next - p_curr; % 点积公式计算夹角 dot_val = vec1(1)*vec2(1) + vec1(2)*vec2(2); norm_val = sqrt(vec1(1)^2 + vec1(2)^2) * sqrt(vec2(1)^2 + vec2(2)^2); % 避免浮点误差导致acos输入超范围 cos_val = max(-1, min(1, dot_val / norm_val)); angles_deg(i) = rad2deg(acos(cos_val)); end disp('各顶点内角(单位:度):'); disp(angles_deg);
以你提供的测试多边形为例,计算得到的6个顶点内角分别约为98.5°、143.3°、127.7°、85.6°、106.2°、98.7°,你可以对应图中红色标记的位置取值。
内容的提问来源于stack exchange,提问作者zsoq
相关产品推荐
相关产品推荐

