已知四个坐标点,怎样求出四边形的四个内角

news2024/12/23 18:11:45

1,理论

最简单的方式利用向量进行求解

 如图可得:

cosθ=a*b/(|a|*|b|)

已知三点坐标,很容易可以得到两向量之积a*b,以及每个的模值

2,四个角度求解过程

  1. 首先,我们定义了四个坐标点pointApointBpointCpointD,这些点构成了一个四边形。

  2. 接下来,我们调用calculateAngle方法来计算四边形的每个内角。calculateAngle方法接受三个参数,分别是三个点的坐标,用于计算夹角。

  3. calculateAngle方法中,我们首先计算向量1的x和y分量,即点p1与点p2之间的向量。然后计算向量2的x和y分量,即点p3与点p2之间的向量。

  4. 接着,我们计算向量1和向量2的点积,即dotProduct = vector1x * vector2x + vector1y * vector2y

  5. 计算向量1和向量2的模,即各自的长度,使用Math.sqrt()方法计算平方根。

  6. 接下来,我们计算夹角的余弦值,即cosTheta = dotProduct / (magnitude1 * magnitude2)

  7. 最后,我们使用Math.acos()方法计算夹角的弧度值,并将其转换为度数,使用Math.toDegrees()方法。

  8. main方法中,我们依次计算四边形的四个内角,并将其打印输出。

3,代码实现

import java.awt.geom.Point2D;

public class QuadrilateralAngles {
    public static void main(String[] args) {
        // 四个坐标点
        Point2D.Double pointA = new Point2D.Double(0, 0);
        Point2D.Double pointB = new Point2D.Double(1, 1);
        Point2D.Double pointC = new Point2D.Double(0, 1);
        Point2D.Double pointD = new Point2D.Double(-1, 0);

        // 计算四边形的四个内角
        double angleA = calculateAngle(pointD, pointA, pointB);
        double angleB = calculateAngle(pointA, pointB, pointC);
        double angleC = calculateAngle(pointB, pointC, pointD);
        double angleD = calculateAngle(pointC, pointD, pointA);

        // 输出结果
        System.out.println("Angle A: " + angleA);
        System.out.println("Angle B: " + angleB);
        System.out.println("Angle C: " + angleC);
        System.out.println("Angle D: " + angleD);
    }

    // 计算夹角的方法
    public static double calculateAngle(Point2D.Double p1, Point2D.Double p2, Point2D.Double p3) {
        // 计算向量1的x和y分量
        double vector1x = p1.getX() - p2.getX();
        double vector1y = p1.getY() - p2.getY();

        // 计算向量2的x和y分量
        double vector2x = p3.getX() - p2.getX();
        double vector2y = p3.getY() - p2.getY();

        // 计算向量1和向量2的点积
        double dotProduct = vector1x * vector2x + vector1y * vector2y;

        // 计算向量1和向量2的模
        double magnitude1 = Math.sqrt(vector1x * vector1x + vector1y * vector1y);
        double magnitude2 = Math.sqrt(vector2x * vector2x + vector2y * vector2y);

        // 计算两向量夹角的余弦值
        double cosTheta = dotProduct / (magnitude1 * magnitude2);

        // 计算夹角的弧度值
        double theta = Math.acos(cosTheta);

        // 将弧度转换为度数并返回
        return Math.toDegrees(theta);
    }
}

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

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

相关文章

Kubernetes+EFK构建日志分析平台

目录 Fluentd 工作原理 1.1、主机初始化配置 1.2、部署docker环境 二、部署kubernetes集群 2.1、组件介绍 2.2、配置阿里云yum源 2.3、安装kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安装master节点 2.6、安装node节点 2.7、安装flannel 3、部署企业…

5G之CSI报告的内容

[TOC]5G之CSI报告的内容 一、CSI包括的内容 1. UE上报的信道状态信息(Channel State Information,CSI)包括 信道质量指示(Channel Quality Indicator, CQI);预编码矩阵指示(Precoding Matrix Indicator&…

QT:定时器事件

定时器第一种办法: 1.利用事件timerEvent,在帮助文档中找到该字段:[override virtual protected] void QTimer::timerEvent(QTimerEvent *e) 重写该虚函数 //重写定时器事件void timerEvent(QTimerEvent *e);2.启动定时器startTimer(1000); …

C++线程库

C线程库是C11新增的重要的技术之一,接下来来简单学习一下吧! thread类常用接口 函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程。thread(fn, args1, args2, ...)构造一个线程对象,并…

Python进阶系列(一)——异常处理

异常处理 在程序中,如果出现异常,我们需要捕捉异常,终止程序(可能的话),并且提示错误信息。 写好异常处理,对于debug有很大的好处,可以帮助我们捕捉到错误所在的位置,以…

centos 7.9 部署django项目

1、部署框架 主要组件:nginx、uwsgi、django项目 访问页面流程:nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署过程 操作系统:centos 7.9 配置信息:4核4G 50G 内网 eip :10.241.103.216 部署过程&…

【STM32】 工程

🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TO…

Maven自定义脚手架(多module模块)+自定义参数

脚手架 视频教程: Maven保姆级教程 脚手架是一个项目模板,包含常用的工程结构、代码。 1 自定义脚手架 脚手架创建的步骤如下,先创建一个工程,把常用的代码写好,进入工程根目录,进行如下操作: …

webSocket 笔记

1 认识webSocket WebSocket_ohana!的博客-CSDN博客 一,什么是websocket WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽…

全网首发 | 科学计算与系统建模仿真系列课程上线啦!

当前,信息物理融合系统(CPS)、基于模型的系统工程(MBSE)、数字孪生、数字化工程等新型技术快速发展,推动装备研制从信息化时代步入到数字化时代,并且呈现数字化与智能化相融合的新时代特点。MWO…

Flink的常用算子以及实例

1.map 特性&#xff1a;接收一个数据&#xff0c;经过处理之后&#xff0c;就返回一个数据 1.1. 源码分析 我们来看看map的源码 map需要接收一个MapFunction<T,R>的对象&#xff0c;其中泛型T表示传入的数据类型&#xff0c;R表示经过处理之后输出的数据类型我们继续往…

vue2+Spring Boot2.7 大文件分片上传

之前我们文章 手把手带大家实现 vue2Spring Boot2.7 文件上传功能 将了上传文件 但如果文件很大 就不太好处理了 按正常情况甚至因为超量而报错 这里 我弄了个足够大的文件 我们先搭建 Spring Boot2.7 环境 首先 application.yml 代码编写如下 server:port: 80 upload:path:…

机器学习、cv、nlp的一些前置知识

为节省篇幅&#xff0c;不标注文章来源和文章的问题场景。大部分是我的通俗理解。 文章目录 向量关于向量的偏导数&#xff1a;雅可比矩阵二阶导数矩阵&#xff1a;海森矩阵随机变量随机场伽马函数beta分布数学术语坐标上升法协方差训练集&#xff0c;验证集&#xff0c;测试集…

2023年7月京东冰箱行业品牌销售排行榜(京东运营数据分析)

作为日常使用的大家电之一&#xff0c;如今我国冰箱产业已渐趋饱满&#xff0c;市场增长有限。今年上半年&#xff0c;冰箱市场整体销额同比去年来看勉强保持小幅增长。不过&#xff0c;7月份&#xff0c;冰箱大盘的销售表现就略显萧条了。 根据鲸参谋电商数据分析平台的相关数…

css3-grid:grid 布局 / 基础使用

一、理解 grid 二、理解 css grid 布局 CSS Grid布局是一个二维的布局系统&#xff0c;它允许我们通过定义网格和网格中每个元素的位置和尺寸来进行页面布局。CSS Grid是一个非常强大的布局系统&#xff0c;它不仅可以用于构建网格布局&#xff0c;还可以用于定位元素&#xf…

cpu和io的关系

在说io的五中模型之前,先说说Io把文件从哪里移到了哪里 自己的理解: 根据工作或者遇到的业务. 文件不可能存在缓存或在内存中,因为缓存和内存不能永久性储存东西, 文件需要被永久性储存.因此文件都存在电脑的硬盘里, 或者存在云服务器的它们的硬盘里. 我们io文件, 第一…

实现语音识别系统:手把手教你使用STM32C8T6和LD3320(SPI通信版)实现语音识别

本文实际是对LD3320&#xff08;SPI通信版&#xff09;的个人理解&#xff0c;如果单论代码和开发板的资料而言&#xff0c;其实当你购买LD3320的时候&#xff0c;卖家已然提供了很多资料。我在大学期间曾经多次使用LD3320芯片的开发板用于设计系统&#xff0c;我在我的毕业设计…

系统学习Linux-Mariadb高可用MHA

概念 MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大程度上…

IDEA 找不到项目 ‘org.springframework.boot:spring-boot-starter-parent:3.1.2‘

找不到项目 ‘org.springframework.boot:spring-boot-starter-parent:2.6.7’ 这个问题主要是因为ide的缓存导致的&#xff0c;我们直接清理缓存并重启ide 重启之后ide会对pom文件进行编排索引完成之后问题就没有了

去掉鼠标系列之一: 语雀快捷键使用指南

其实应该是系列之二了&#xff0c;因为前面写了一个关于Interlij IDEA的快捷键了。 为什么要写这个了&#xff0c;主要是觉得一会儿用鼠标&#xff0c;一会儿键盘&#xff0c;一点儿不酷&#xff0c;我希望可以一直用键盘&#xff0c;抛开鼠标。后面陆续记录一下各个软件的快捷…