给定一个多边形的点集——判断所给点集的方向为顺时针方向还是逆时针方向【java实现+原理讲解】

问题

  给定一个点集,按照索引从小到大的顺序遍历将点集的点相连接可以形成一个多边形。如何判断所给点集的方向是顺时针方向还是逆时针方向呢?
  如下图的左图,随着索引的增加,取出来的点绕顺时针排布,类似于时钟的指针走动的方向,即该点集的方向为顺时针方向。右图的点集为逆时针方向,因为点集的索引围绕逆时针方向增加。
在这里插入图片描述

方法

  1. 取最高点:首先按照坐标值选择出y值最大的点,即最高的点。如果最高的点数量有多个,说明组成多边形的点集中存在冗余点(两点确定一条线段,如果两点所确定的线段中存在其他点,则这些点为冗余点),那就需要先进行去重操作(这里不进行赘述)。
  2. 取最高点的前点和后点:假设点集的点的数量为n,若最高点的索引为j,则需要计算前一个索引i(若j=0,则i=n-1),和后一个索引k(若j=n-1,则k=0)。
  3. 通过向量叉乘来判断顺逆方向:设 a → = ( x j − x i , y j − y i ) \overset{\rightarrow}{a}=\text{(}x_j-x_i,y_j-y_i\text{)} a=xjxi,yjyi b → = ( x k − x i , y k − y i ) \overset{\rightarrow}{b}=\text{(}x_k-x_i,y_k-y_i\text{)} b=xkxi,ykyi,通过判断 a → × b → \overset{\rightarrow}{a}\times \overset{\rightarrow}{b} a×b的正负即可判断点集的顺逆时针,具体操作如下图

在这里插入图片描述

java代码实现

private void correctPolygonDirection(List<Point> pointList) {

    if (pointList.size() == 0) {
        return;
    }

    // // 找到零件的最高点
    int highestPointIndex = -1;
    double highestY = -Double.MAX_VALUE;
    for (int i = 0; i < pointList.size(); i++) {
        if (pointList.get(i).getY() > highestY) {
            highestY = pointList.get(i).getY();
            highestPointIndex = i;
        }
    }

    // // 纠正坐标
    /// 判断随着索引的进位,夹角是否为正数
    // 存储方向,1:顺时针;-1:逆时针
    int direction = 0;
    Point lastPoint = pointList.get((highestPointIndex - 1 + pointList.size()) % pointList.size());
    Point curPoint = pointList.get(highestPointIndex);
    Point nextPoint = pointList.get((highestPointIndex + 1) % pointList.size());
    double x1 = curPoint.getX() - lastPoint.getX();
    double y1 = curPoint.getY() - lastPoint.getY();
    double x2 = nextPoint.getX() - lastPoint.getX();
    double y2 = nextPoint.getY() - lastPoint.getY();

    // 计算向量的叉积
    double crossProduct = x1 * y2 - x2 * y1;
    if (crossProduct > 0) {
        direction = -1;
    } else if (crossProduct < 0) {
        direction = 1;
    }
    
}

怎么样,代码是不是很简单,天资聪慧的你肯定一下就学会了,如果觉得文章对你有帮助,麻烦点点赞,谢谢你。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
机械臂在给定三维路径点集使用粒子群算法求解逆运动学的matlab代码如下: ```matlab function [jointAngles] = particleSwarmIK(targetPoints, initialGuess, maxIterations, numParticles) numLinks = 6; % 机械臂关节数量 % 粒子群算法参数 inertiaWeight = 0.5; % 惯性权重 cognitiveFactor = 2; % 个体认知因子 socialFactor = 2; % 社会因子 maxVelocity = 0.1; % 最大速度 minJointLimits = [-pi, -pi, -pi, -pi, -pi, -pi]; % 关节角度最小限制 maxJointLimits = [pi, pi, pi, pi, pi, pi]; % 关节角度最大限制 numDimensions = numLinks; % 维度为关节数量 bestParticlePosition = initialGuess; % 初始化粒子的最佳位置为初始猜测 for i = 1:maxIterations % 更新每个粒子的位置和速度 for j = 1:numParticles % 计算个体认知部分 cognitiveComponent = cognitiveFactor * rand() * (bestParticlePosition - particlePositions(j,:)); % 计算社会部分 socialComponent = socialFactor * rand() * (bestParticlePosition - particlePositions(j,:)); % 更新速度和位置 particleVelocities(j,:) = inertiaWeight * particleVelocities(j,:) + cognitiveComponent + socialComponent; particleVelocities(j,:) = min(max(particleVelocities(j,:), -maxVelocity), maxVelocity); particlePositions(j,:) = particlePositions(j,:) + particleVelocities(j,:); % 判断是否越界 particlePositions(j,:) = min(max(particlePositions(j,:), minJointLimits), maxJointLimits); % 计算适应度 fitness(j) = calculateFitness(particlePositions(j,:), targetPoints); % 更新最佳位置 if fitness(j) < calculateFitness(bestParticlePosition, targetPoints) bestParticlePosition = particlePositions(j,:); end end end jointAngles = bestParticlePosition; end function [fitness] = calculateFitness(jointAngles, targetPoints) % 根据给定的关节角度计算末端执行器的位置 endEffectorPosition = calculateEndEffectorPosition(jointAngles); % 计算每个目标点与末端执行器位置的距离 distances = sqrt(sum((endEffectorPosition - targetPoints).^2, 2)); % 适应度为距离之和 fitness = sum(distances); end function [endEffectorPosition] = calculateEndEffectorPosition(jointAngles) % 根据给定的关节角度计算末端执行器的位置 % 请根据具体的机械臂模型进行计算 % 这里假设计算方法为forward kinematics % endEffectorPosition = ... % 示例:随机生成一个位置作为末端执行器位置 endEffectorPosition = rand(1, 3); end ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Dam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值