两个直线/线段的交点 - C++

news2024/11/30 5:01:33

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

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

 原理:

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

c++代码如下

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

const double eps = 1e-6;

struct Point
{
    Point(){}
    Point(double x,double y):x(x),y(y){}
    double x,y;
};

int sgn(double x)
{
    return x<-eps ? -1 : (x>eps);
}

double Cross(const Point& p1,const Point& p2,const Point& p3,const Point& p4)
{
    return (p2.x-p1.x)*(p4.y-p3.y) - (p2.y-p1.y)*(p4.x-p3.x);
}

double Area(const Point& p1,const Point& p2,const Point& p3)
{
    return Cross(p1,p2,p1,p3);
}

double fArea(const Point& p1,const Point& p2,const Point& p3)
{
    return fabs(Area(p1,p2,p3));
}

bool Meet(const Point& p1,const Point& p2,const Point& p3,const Point& p4)
{
    return max(min(p1.x,p2.x),min(p3.x,p4.x)) <= min(max(p1.x,p2.x),max(p3.x,p4.x))
        && max(min(p1.y,p2.y),min(p3.y,p4.y)) <= min(max(p1.y,p2.y),max(p3.y,p4.y))
        && sgn(Cross(p3,p2,p3,p4) * Cross(p3,p4,p3,p1)) >= 0
        && sgn(Cross(p1,p4,p1,p2) * Cross(p1,p2,p1,p3)) >= 0;
}

Point Inter(const Point& p1,const Point& p2,const Point& p3,const Point& p4)
{
    double k = fArea(p1,p2,p3) / fArea(p1,p2,p4);
    return Point((p3.x + k*p4.x)/(1+k),(p3.y + k*p4.y)/(1+k));
}

int main()
{
        Point p1(300, 300);
        Point p2(500, 500);

        Point p3(500, 300);
        Point p4(300, 500);

        if (Meet(p1, p2, p3, p4))
        {
                cout<< "p1p2和p3p4相交" <<endl;
                Point re = Inter(p1, p2, p3, p4);
                cout << re.x<<endl;
                cout << re.y <<endl;
        }
        else
        {
                cout<< "p1p2和p3p4不相交" <<endl;
        }

        Point p5(100, 100);
        Point p6(100, 500);
        if (Meet(p1, p2, p5, p6))
        {
                cout<< "p1p2和p5p6相交" <<endl;
                Point re = Inter(p1, p2, p5, p6);
                cout << re.x<<endl;
                cout << re.y <<endl;
        }
        else
        {
                cout<< "p1p2和p5p6不相交" <<endl;
        }
        return 0;
}

 执行结果如下图

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

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

相关文章

压力山大?搭建JMeter分布式压测环境轻松应对!

目录 引言 windows环境部署 1.安装环境变量 2.配置环境变量 3.修改Jmeter配置文件 4.启动jmeter 5.启动分布式服务 Linux环境部署 1.安装JDKJmeter 2.环境优化 4.编写Jmeter脚本 5.启动Jmeter 6.停止Jmeter 7.打包查看测试报告 引言 您想要提高您的应用程序的性…

【JavaSE】Java基础语法(三十五):多线程实战

文章目录 1. 多线程入门1.1 多线程相关概念1.2 什么是多线程1.3 多线程的创建方式1.3.1 继承 Thread 的方式1.3.2 实现 Runnable 接口的方式1.3.3 实现 Callable 接口的方式1.3.4 Thread 类中常用方法1.3.5 sleep() 方法 和 wait() 方法区别&#xff1a; 2. 线程安全2.1 线程安…

破坏单例模式--存在的问题---问题的解决

目录 破坏单例模式--存在的问题---问题的解决 问题演示 破坏单例模式&#xff1a; 序列化 反射 序列化反序列化&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 反射 代码&#xff1a; 运行结果&#xff1a; 问题的解决 序列化、反序列方式破坏单例模式的解…

Elasticsearch 8.X 性能优化参考 —— 筑梦之路

Elasticsearch 是实现用户无缝搜索体验的关键工具。它通过提供快速、准确和相关的搜索结果&#xff0c;彻底改变了用户与应用程序的互动方式。然而&#xff0c;要确保 Elasticsearch 部署达到最佳性能&#xff0c;就必须关注关键指标&#xff0c;并对诸如索引、缓存、查询、搜索…

monorepo 项目 Unable to resolve path to module ‘xxx‘.eslintimport/no-unresolved

同事问了一个问题&#xff0c;他现在参加了一个项目&#xff0c;这个项目是个monorepo 项目。 也就是多包管理、前后端一起都是js 写的。 问题 后端express 项目里配置的路径别名&#xff0c;eslint 不认识&#xff0c;报错。 Unable to resolve path to module /app/Prisma.e…

Phaser笔记-鼠标点击获取坐标键盘控制sprite

代码如下&#xff1a; import phaser;class PlayGame extends Phaser.Scene {constructor() {super("PlayGame");}preload() {this.load.spritesheet(run, assets/_Run.png, {frameWidth: 120, frameHeight: 80});this.load.spritesheet(idle, assets/_Idle.png, {f…

GEE:对Sentinel-2遥感影像进行处理,水体提取与可视化

作者&#xff1a;CSDN _养乐多_ 本文介绍了通过Google Earth Engine平台&#xff0c;并使用哨兵数据提取水体掩膜的方法和代码。通过裁剪和去除云等处理步骤&#xff0c;最终得到具有水体掩膜的影像&#xff0c;并进行可视化和导出。这种方法基于归一化水体指数&#xff08;N…

MIT 6.S081 (BOOK-RISCV-REV1)教材第一章内容

MIT 6.S081 教材第一章内容 引言第一章 操作系统接口进程和内存I/O和文件描述符管道文件系统真实世界 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第一章教材内容翻译加整理。 本课程前置知识主要涉及: C语言(建议阅读C程序语言设计—第二版)RISK-V汇编推荐阅读: 程…

JavaScript 数据透视表 DHTMLX Pivot Crack

DHTMLX Pivot JavaScript 数据透视表 - 强大的数据汇总和报告 使用我们的高速 JavaScript/HTML5 Pivot 组件可视化您的复杂数据&#xff0c;从而提高您的商业智能。 它可以帮助您以方便的方式汇总大型数据集。 主要特征 纯 JavaScript 库&#xff0c;可轻松与任何服务器端集成…

Linux安装Mysql8,过程详细(离线安装mysql)

因公司需要&#xff0c;需要在服务器上安装一个mysql&#xff0c;但是机器没有外网权限&#xff0c;所以记录一下安装过程&#xff0c;供大家参考。 官网下载安装包 地址&#xff1a;https://dev.mysql.com/downloads/ 如图示&#xff0c;选择MySQL Community Server 如图示&a…

git新手将网页设计代码提交到github上

以下是将代码提交到Github上的一些步骤。如果中途遇到问题或不会的需要我帮忙&#xff0c;可以文章底部联系我。 1. 创建Github账户 首先&#xff0c;您需要在Github上注册一个账户。 如果您已经有账户了&#xff0c;请跳过这一步。 2. 创建一个新的repository 在您的Githu…

格式化数字的实用命令:numfmt

在 Linux 系统中&#xff0c;numfmt 是一个用于格式化数字的实用工具。它可以将数字转换为不同的表示方式&#xff0c;如十进制、二进制、字节单位等。本文将详细介绍 numfmt 命令的使用方法&#xff0c;并提供一些适合初学者的示例。 Numfmt 命令语法 numfmt 命令的基本语法如…

搭建stm32电机控制代码框架(四)——单路PWM生成

STM32中单路PWM的生成一般是基于某一个通用定时器&#xff0c;本次小实验选取TIM2通用定时器&#xff0c;选择PA5作为PWM端口输出。配置步骤如下&#xff1a; 第一步&#xff1a;配置外部晶振与基本的时钟&#xff0c;如下图所示。 &#xff08;1&#xff09;选择外部晶振 &a…

关于java k8s容器环境中的jvm配置与优化

1. 前言 环境 版本 备注 k8s v1.22 配置cpu/mem limit、健康/就绪检查 openjdk 8 openjdk version "1.8.0_342" k8s容器化&#xff08;docker&#xff09;环境更好的解决了 java app 运行环境的封装问题。但存在着一些限制&#xff0c;比如 Java 并不能发现…

流马平台连接数据库

新增数据库配置 在环境管理处对于环境下新增数据库配置 编辑SQL 在用例管理-步骤编辑-逻辑控件处添加前置SQL&#xff0c;编辑SQL 选择数据库名称&#xff0c;查询语句&#xff0c;填写要保存的变量名&#xff0c;并在下方填写查询语句 示例从user表中取出username和passwo…

Semi-supervised Learning(半监督学习)

目录 Introduction Why semi-supervised learning help&#xff1f; Semi-supervised Learning for Generative Model Supervised Generative Model Semi-supervised Generative Model Low-density Separation Assumption Self Training Entropy-based Regularization(基…

docker启动MYSQL8并挂载数据目录

1.创建需要docker挂载的数据目录 mkdir -p /datah/mydata/mysql/conf mkdir -p /datah/mydata/mysql/data mkdir -p /datah/mydata/mysql/log mkdir -p /datah/mydata/mysql/mysql-files 2. 在目录下面 /datah/mydata/mysql/conf 创建配置文件 my.cnf [client] default-charact…

VH6501使用

目录 1.VH6501接口介绍 2.使用场景 2.1当VH6501作为硬件接口卡作通信/监测使用时&#xff0c;使用CH1的任意接口与总线连接即可 2.2针对单节点干扰时&#xff0c;使用CH1的任意接口与被测节点连接即可 2.3针对多节点干扰时&#xff0c;需要通过CH1的两个接口将VH6501串联到…

C++ ---- 模板

目录 泛型编程 函数模板 函数模板语法 模板使用 函数模板原理 函数模板的实例化 隐式实例化 显示实例化 模板参数的匹配原则 类模板 类模板的定义语法 类模板的实例化 非类型模板参数 类模板的特化 全特化 半特化&#xff08;部分特化&#xff09; 两个参数偏…

排查Javascript内存泄漏案例(一)

Chrome DevTools里的Performance面板和Memory面板可以用来定位内存问题。 如何判断应用发生内存泄漏&#xff1f; 为了证明螃蟹的听觉在腿上&#xff0c;一个专家捉了只螃蟹并冲它大吼&#xff0c;螃蟹很快就跑了。然后捉回来再冲它吼&#xff0c;螃蟹又跑了。最后专家把螃蟹的…