java 圆的交点_Java:三角形的内切圆,外接圆

本文介绍了一个Java程序,用于计算并绘制三角形的内切圆和外接圆,包括圆心坐标、半径等关键几何属性。通过具体的代码实现,展示了如何基于三角形的顶点坐标来计算这些重要的几何参数。

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

================================= Triangle.java ==============================

import java.awt.geom.Point2D;

/*

1. 垂心: 三角形三条边上的高相交于一点.这一点叫做三角形的垂心.

2. 重心: 三角形三条边上的中线交于一点.这一点叫做三角形的重心.

3. 外心: 三角形三边的中垂线交于一点.这一点为三角形外接圆的圆心.

4. 内心三角形三内角平分线交于一点.这一点为三角形内切圆的圆心.

重心: 三边上中线的交点

垂心: 三条高的交点

内心: 内接圆圆心, 三个角角平分线交点

外心: 外接圆圆心, 三条边的垂直平分线交点, 三角形三条边的垂直平分线的交点

锐角三角形的外心在三角形内

直角三角形的外心是斜边的中点

钝角三角形的外心在三角形外

a, b, c是三角形的三条边条

面积s:   s*s=p(p-a)(p-b)(p-c), p=(a+b+c)/2

外圆半径 = abc / (4*面积)

内圆半径 = 2 * 面积 / 周长

内切圆心坐标(x,y): 三角形三个顶点的坐标:A(x1,y1),B(x2,y2),C(x3,y3)

x=(x1*BC+x2*CA+x3*AB)/(AB+BC+CA);

y=(y1*BC+y2*CA+y3*AB)/(AB+BC+CA).

*/

public class Triangle {

// 三角形的三个顶点

private Point2D.Double p1;

private Point2D.Double p2;

private Point2D.Double p3;

privatedoubledis12;

privatedoubledis23;

privatedoubledis31;

public Triangle(Point2D.Double p1, Point2D.Double p2, Point2D.Double p3) {

this.p1 = p1;

this.p2 = p2;

this.p3 = p3;

dis12 = distenceOfPoints(p1, p2);

dis23 = distenceOfPoints(p2, p3);

dis31 = distenceOfPoints(p3, p1);

}

// 两点之间的距离

public static double distenceOfPoints(Point2D.Double p1, Point2D.Double p2) {

return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));

}

// 内切圆圆心

public Point2D.Double innerCenter() {

double p = perimeter();

double x = (p1.x * dis23 + p2.x * dis31 + p3.x * dis12) / p;

double y = (p1.y * dis23 + p2.y * dis31 + p3.y * dis12) / p;

return new Point2D.Double(x, y);

}

// 外切圆圆心

public Point2D.Double outerCenter() {

double x1 = p1.x;

double x2 = p2.x;

double x3 = p3.x;

double y1 = p1.y;

double y2 = p2.y;

double y3 = p3.y;

double x = ((y2 - y1) * (y3 * y3 - y1 * y1 + x3 * x3 - x1 * x1) - (y3 - y1)

* (y2 * y2 - y1 * y1 + x2 * x2 - x1 * x1))

/ (2 * (x3 - x1) * (y2 - y1) - 2 * ((x2 - x1) * (y3 - y1)));

double y = ((x2 - x1) * (x3 * x3 - x1 * x1 + y3 * y3 - y1 * y1) - (x3 - x1)

* (x2 * x2 - x1 * x1 + y2 * y2 - y1 * y1))

/ (2 * (y3 - y1) * (x2 - x1) - 2 * ((y2 - y1) * (x3 - x1)));

return new Point2D.Double(x, y);

}

// 内切圆半径

public double innerRadius() {

return (2 * area()) / (dis12 + dis23 + dis31);

}

// 外接圆半径

public double outerRadius() {

return (dis12 * dis23 * dis31) / (4 * area());

}

// 三角形的面积

public double area() {

double p = 0.5 * perimeter();

return Math.sqrt(p * (p - dis12) * (p - dis23) * (p - dis31));

}

// 三角形的周长

public double perimeter() {

return dis12 + dis23 + dis31;

}

// 取得三角形的三个顶点

public Point2D.Double getP1() {

return (Point2D.Double) p1.clone();

}

public Point2D.Double getP2() {

return (Point2D.Double) p2.clone();

}

public Point2D.Double getP3() {

return (Point2D.Double) p3.clone();

}

}

================================= TriangleDrawer.java ==============================

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.RenderingHints;

import java.awt.Toolkit;

import java.awt.geom.Point2D;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

public class TriangleDrawer extends JPanel {

privatestaticfinallongserialVersionUID= 1L;

private Triangle triangle;

public TriangleDrawer() {

triangle = new Triangle(new Point2D.Double(100, 100), new Point2D.Double(207, 130),

new Point2D.Double(220, 200));

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// 绘制三角形

drawLine(g, triangle.getP1(), triangle.getP2());

drawLine(g, triangle.getP2(), triangle.getP3());

drawLine(g, triangle.getP3(), triangle.getP1());

// 内接圆

double radius = triangle.innerRadius();

Point2D.Double center = triangle.innerCenter();

g.setColor(Color.BLUE);

drawCircle(g, center, radius);

// 外接圆

radius = triangle.outerRadius();

center = triangle.outerCenter();

g.setColor(Color.RED);

drawCircle(g, center, radius);

}

protected void drawLine(Graphics g, Point2D.Double startPoint, Point2D.Double endPoint) {

g.drawLine((int) startPoint.x, (int) startPoint.y, (int) endPoint.x, (int) endPoint.y);

}

protected void drawCircle(Graphics g, Point2D.Double center, double radius) {

g.drawOval((int) (center.x - radius), (int) (center.y - radius), (int) (2 * radius),

(int) (2 * radius));

}

private static void createGUIAndShow() {

JFrame frame = new JFrame("三角形");

JPanel contentPane = new TriangleDrawer();

frame.setContentPane(contentPane);

Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();

int w = 500;

int h = 500;

int x = (ss.width - w) / 2;

int y = (ss.height - h) / 2;

x = x > 0 ? x : 0;

y = y > 0 ? y : 0;

frame.setBounds(x, y, w, h);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

createGUIAndShow();

}

});

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值