两个直线/线段的交点 - golang

news2024/11/17 10:43:08

问题,求上图中线段AB 和线段CD的交点P的坐标

根据《算法艺术与信息学竞赛》,公式如下

 

原理:

利用叉积求得点P分线段DC的比,然后利用高中学习的定比分点坐标公式求得分点P的坐标

要注意的是

若判断是两条线段,需先判断能否相交,相交的时候才可调用该公式求相交点

golang代码如下

package main

import (
   "fmt"
   "math"
)

type Point struct {
   X     int32
   Y     int32
}
func (p Point) GetX() int32 {
   return p.X
}
func (p Point) GetY() int32 {
   return p.Y
}

const  eps = 1e-6    // 最小精度误差

func sgn(x float64) int {
   if x < -eps {
      return -1
   }
   return 1
}

func Cross(p1 *Point, p2 *Point, p3 *Point, p4 *Point) float64 {
   return (float64(p2.GetX())-float64(p1.GetX())) * (float64(p4.GetY())-float64(p3.GetY())) - (float64(p2.GetY())-float64(p1.GetY())) * (float64(p4.GetX())-float64(p3.GetX()))
}

func Area(p1 *Point, p2 *Point, p3 *Point) float64 {
   return Cross(p1, p2, p1, p3)
}

func fArea(p1 *Point, p2 *Point, p3 *Point) float64 {
   return math.Abs(Area(p1, p2, p3))
}

// 判断两条线段能否相交
func Meet(p1, p2, p3, p4 *Point) bool {
   return     math.Max(math.Min(float64(p1.GetX()), float64(p2.GetX())), math.Min(float64(p3.GetX()), float64(p4.GetX()))) <=
         math.Min(math.Max(float64(p1.GetX()), float64(p2.GetX())), math.Max(float64(p3.GetX()), float64(p4.GetX())))      &&
         math.Max(math.Min(float64(p1.GetY()), float64(p2.GetY())), math.Min(float64(p3.GetY()), float64(p4.GetY()))) <=
         math.Min(math.Max(float64(p1.GetY()), float64(p2.GetY())), math.Max(float64(p3.GetY()), float64(p4.GetY())))      &&
         (float64(sgn(Cross(p3, p2, p3, p4))) * Cross(p3, p4, p3, p1) >= 0)                                     &&
         (float64(sgn(Cross(p1, p4, p1, p2))) * Cross(p1, p2, p1, p3) >= 0)
}

// 计算两个直线的交叉点(若是判断两个线段,需先经过上面Meet()函数的检测,结果为true的才可调用本函数)
func Inter(p1 *Point, p2 *Point, p3 *Point, p4 *Point) Point {
   k := fArea(p1, p2, p3) / fArea(p1, p2, p4)
   return Point {
      X: int32( (float64(p3.GetX())+k*float64(p4.GetX())) / (1+k) ),
      Y: int32( (float64(p3.GetY())+k*float64(p4.GetY())) / (1+k) ),
   }
}

func main() {
   // 线段1
   p1 := &Point{X:300,Y:300}
   p2 := &Point{X:500,Y:500}
   // 线段2
   p3 := &Point{X:300,Y:500}
   p4 := &Point{X:500,Y:300}

   if Meet(p1, p2, p3, p4) {
      fmt.Printf("p1p2和p3p4相交 \n")
      p := Inter(p1, p2, p3, p4)
      fmt.Printf("相交点p=%v \n", p)
   } else {
      fmt.Printf("p1p2和p3p4不相交 \n")
   }

   // 线段3
   p5 := &Point{X:100,Y:100}
   p6 := &Point{X:100,Y:500}
   if Meet(p1, p2, p5, p6) {
      fmt.Printf("p1p2和p5p6相交 \n")
      p := Inter(p1, p2, p3, p4)
      fmt.Printf("相交点p=%v \n", p)
   } else {
      fmt.Printf("p1p2和p5p6不相交 \n")
   }
}

 执行结果如下:
E:\go_test\两条线段相交2>go run main.go
p1p2和p3p4相交
相交点p={400 400}
p1p2和p5p6不相交

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/592771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT到底有多聪明?附上一份GPT研究报告!(十七)

转载自 AI 源起 GPT的出现&#xff0c;不得不说是人类整个科技发展史上的里程碑。那么你知道GPT到底有多聪明吗&#xff1f;它的边界在哪&#xff1f;我们这个系列将为您着重阐述这一点。 人的专长、工作和经济 GPT-4在一系列任务和领域中的卓越表现将挑战关于人类和机器在…

合肥工业大学嵌入式系统原理实验报告

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a; &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远是个观众。…

Hive库表基本操作

Hive基本操作-库、表 规则语法 大小写规则: 1. hive的数据库名、表名都不区分大小写 2. 建议关键字大写 复制代码 命名规则&#xff1a; 1. 名字不能使用数字开头 2. 不能使用关键字 3. 尽量不使用特殊符号 复制代码 库操作语法 创建数据库 创建数据库的本质就是在hive…

基于UNnet(backbone=resnet34) 对 PASCAL VOC 的分割

目录 1. 介绍 2. tools 代码文件夹 2.1 get_palette 2.2 transform 3. train 部分 4. 结果展示 1. 介绍 本文使用resnet 34作为backbone代替传统unet的 vgg&#xff0c;实现对PASCAL VOC的分割 训练了两百个epoch后&#xff0c;mean iou到达了0.4左右&#xff0c;没…

如何管理银行多网点监控?用这方法就够了!

随着科技进步和生活水平的不断提高&#xff0c;人们对于餐饮消费的需求也逐渐变得多样化和个性化。 高校食堂现状分析 01.信息化水平低&#xff0c;学校管理难&#xff0c;无法精准就餐&#xff1b; 02用户满意度低&#xff0c;学生取餐环节效率低&#xff1b; 03.管理效率低…

音视频入门

1 音视频核心知识 1.1 视频录制原理 1.2 视频&#xff08;音频视频&#xff09;播放原理 2 图像基础概念 2.1 像素 2.2 分辨率 隔行扫描 逐行扫描 2.3 位深 RGB 通常每个通道用8bit表示 每个通道位深越大&#xff0c;能够表示的颜色值就越大 2.4 帧率 帧率越高&#xff…

Web的基本漏洞--CSRF漏洞

目录 一、CSRF漏洞介绍 1.CSRF漏洞原理 2.CSRF漏洞的类型 3.漏洞识别 4.漏洞攻击 5.CSRF漏洞的危害 6.CSRF漏洞防御 7.CSRF和XSS的区别 一、CSRF漏洞介绍 1.CSRF漏洞原理 CSRF&#xff08;cross site request forgery&#xff09;是指跨站请求伪造,是指利用受害者尚未…

智慧工厂~经典开源项目数字孪生智慧工厂——开源工程及源码

以领先的数字孪生技术为基础&#xff0c;全面打造智慧工厂。现有云南某大型汽车加工厂工程和源码免费赠送&#xff01; 项目介绍 智慧工厂基于数字孪生技术创建了一个真实的三维模型场景。通过对传感器和机器的数据采集、分析处理&#xff0c;实时监控各生产环节&#xff0c;优…

CS5523规格书|MIPI 转DP/eDP转换芯片|DSI转DP/eDP转换芯片

ASL CS5523是MIPI DSI输入、DP/e DP输出转换芯片。MIPI DSI最多支持4个通道&#xff0c;每个通道的最大运行速度为1.5Gps。对于DP 1.2输出&#xff0c;它由4个数据通道组成&#xff0c;支持1.62Gbps和2.7Gbps的链路速率。支持1.62Gbps和2.7Gbps的链路速率。它支持2560的最高分辨…

chatgpt赋能python:Python中最大公约数的函数介绍

Python中最大公约数的函数介绍 在数学中&#xff0c;最大公约数&#xff08;GCD&#xff09;是两个或多个整数的最大公约数。 Python是一种高级编程语言&#xff0c;具有内置的GCD函数。在本篇文章中&#xff0c;我们将介绍Python中的最大公约数函数&#xff0c;以及如何使用它…

【C++】类和对象 - 封装 - 属性和行为,访问权限,class 和 struct区别,成员属性私有化

No.Contents1【C】基础知识 - HelloWorld&#xff0c;注释&#xff0c;变量&#xff0c;常量&#xff0c;关键字&#xff0c;标识符2【C】数据类型 - 整型&#xff0c;sizeof&#xff0c;实型&#xff0c;字符型&#xff0c;转义字符&#xff0c;字符串类型&#xff0c;布尔类型…

web前端 -- javascript(02) -- 数据类型转换、常见运算符及顺序、选择和循环结构

数据类型转换 &#xff08;1&#xff09;自动类型转换&#xff1a; 特点&#xff1a;低类型自动向高类型进行转换 boolean < int < float < string PS&#xff1a; boolean类型如果与数值型进行运算&#xff1a;true 1&#xff1b;false 0其他基本数据类型与字符串…

whistle以及谷歌插件Proxy SwitchyOmega实现代理

whistle提供本地服务器&#xff0c;以及代理 Proxy SwitchyOmega拦截浏览器的网络请求&#xff0c;指向whistle服务 ip 为什么要用它们呢&#xff1f; 其实一开始使用的是mac的charles&#xff0c;但是出现了网页上传文件数据的时候会被篡改&#xff0c;也可能是我配置的原因…

声明式事务控制

声明式事务控制 编程式事务控制相关对象 PlatformTransactionManager PlatformTransactionManager接口是spring的事务管理器&#xff0c;它里面提供了常用的操作事务的方法 方法说明TransactionStatus getTransaction(TransactionDefaultion defination)获取事务的状态信息…

外贸跨境商城系统-后台采集-外贸跨境电商平台搭建

一、外贸跨境商城系统框架 欢迎名片交流 JAVA语言 后端: SpringBoot, Mysql8.0, Redis, Nginx 手机端&#xff1a;uniapp, H5, App打包 前端布局&#xff1a;H5端、PC电脑端、APP端、小程序端 后台&#xff1a;总后台管理、商家后台管理 二、外贸跨境商城基础功能架构…

Chrome浏览器的自动播放限制策略(原文)

客户&#xff1a;为什么明明我设为自动播放了&#xff0c;却无法自动播放&#xff1f;我&#xff1a;#$%^#~客户&#xff1a;为什么其他浏览器可以自动播放&#xff0c;Chrome浏览器不能自动播&#xff0c;您们产品有问题...我&#xff1a;^$&*^(*&^(*% 好吧&#xff…

【CesiumJS入门】(0)专栏介绍&项目搭建

前言 开了一个新的专栏&#xff0c;叫【CesiumJS入门】&#xff0c;因为自己也是初学者&#xff0c;所以专栏主要是记录自己学习CesiumJS的过程&#xff0c;如果还能给后来者带来一点参考那就真是太好了。 本项目的仓库地址&#xff1a;https://gitee.com/cswwww/cesium-tyro…

Python入门教程+项目实战-13.1节-集合基础概念

目录 13.1.1 理解集合类型 13.1.2 集合的类型名 13.1.3 集合的定义 13.1.4 在循环中遍历集合 13.1.5 集合的元素输出顺序 13.1.6 知识要点 13.1.7 系统学习python 13.1.1 理解集合类型 集合类型与字典类型非常接近&#xff0c;Python中的集合类型也是用{}符号括住的一个…

Zemax Lumerical | 二维光栅出瞳扩展系统优化(下)

简介 本文提出并演示了一种以二维光栅耦出的光瞳扩展&#xff08;EPE&#xff09;系统优化和公差分析的仿真方法。 在这个工作流程中&#xff0c;我们将使用3个软件进行不同的工作 &#xff0c;以实现优化系统的大目标。首先&#xff0c;我们使用 Lumerical 构建光栅模型并使用…

封装设计!抽象BasePage,提升WEB自动化测试用例质量和效率

目录 前言&#xff1a; 一、什么是抽象BasePage 二、BasePage中的属性和方法 三、BasePage中的代码实现 四、抽象Page对象 五、测试用例 六、总结 前言&#xff1a; 对于测试工程师来说&#xff0c;WEB自动化测试是非常重要的一部分。然而&#xff0c;WEB自动化测试的开…