CCW 算法( POJ_1912)

本文介绍了CCW算法,用于判断点与线的位置关系。通过向量叉积的概念,可以确定一个点相对于两条已知直线的顺时针或逆时针位置。具体公式为a × b = x1⋅y2 - x2⋅y1。当叉积大于0时,点在直线的顺时针方向;小于0则在逆时针方向;等于0则共线。该算法可用于判断点C是否位于向量AB的左侧,计算公式为AB x AC = (x1y2 + x2y3 + x3y1) - (y1x2 + y2x3 + y3x1)。同时,给出了POJ_1912题目的链接作为实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 判断点和线的位置关系

向量叉积是用来判断两个向量之间方向的
他的计算方法如下:
在这里插入图片描述

假设两个向量分别为a-> =(x1,y1),b-> =(x2,y2),则a向量 与b向量 的叉积如下定义:
a ×b =x1⋅y2−x2⋅y1
其中,符号×用来表示向量叉积运算。而a向量 和b向量 都是以坐标原点为起点,以上面给出的坐标:(x1,y1), (x2,y2 为终点的两个向量。


根据这个叉积的算法,我们不难得到以下规律:
若a ×b >0,则a 在b 的顺时针方向
若a ×b <0,则a 在b 的逆时针方向
若a ×b =0,则a 与b 共线


a x b = |a|.|b|.sinθ
** = x1.y2 - x2.y1**
例如:
三个点: A:(x1,y1) B
:(x2,y2) C
**:(x3,y3)
判断点 C 在 向量 AB 的左边还是右边?
交叉想成法 :
x1 x2 x3 x1**
y1 y2 y3 y1
AB x AC = (x1y2 + x2y3 + x3y1) -(y1x2 + y2x3 + y3x1)
当 >0 时 ,则 C 点在 AB 的左侧

static class Point{
   
   
    double x,y;
    public Point(double x,double y) {
   
   
        this.x = x;
        this.y = y;
    }
}
//ccw
private static int CCW(Point p1, Point p2, Point p3) {
   
   
	return (p1.x*p2.y+p2.x*p3.y+p3.x*p1.y)-(p1.y*p2.x+p2.y*p3.x+p3.y*p1.x) >0? 1:-1;
}

例题: POJ_1912 CCW算法 http://poj.org/problem?id=1912

package jihe;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;
/**
 * poj_1912
 * @author Administrator
 */
public class CCW_1912 {
   
   
	public static Point[] p;
	public static Point[] LineP;
	public static Point entry;
	public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值