基于JSXGraph的圆外公切圆作图

Alt

本文由ScriptEcho平台提供技术支持

项目地址:传送门

基于JSXGraph的圆外公切圆作图

应用场景介绍

本代码可用于在线绘制圆外公切圆,在几何教学、图形设计等领域有广泛应用。

代码基本功能介绍

该代码使用JSXGraph库,实现以下功能:

  • 创建两个圆和一个圆心连线
  • 创建圆外公切圆
  • 求出圆外公切圆与原圆的交点
  • 绘制圆外公切圆的切线和半径

功能实现步骤及关键代码分析

1. 加载JSXGraph库

const loadJavascript = (jsUrl) => { ... }
const loadStyle = (styleUrl) => { ... }

使用loadJavascriptloadStyle函数加载JSXGraph库的JavaScript和CSS文件。

2. 创建JSXGraph画板

var brd = JXG.JSXGraph.initBoard('jxgbox', { boundingbox: [-6, 6, 6, -6] })

使用initBoard函数创建JSXGraph画板,并设置其边界框。

3. 创建圆、圆心连线和圆外公切圆

o1 = brd.create('point', [-2, 2], { name: 'O1' })
o2 = brd.create('point', [3, -3], { name: 'O2' })

p1 = brd.create('point', [-3, 5], { name: 'P1' })
p2 = brd.create('point', [2, -3], { name: 'P2' })

c1 = brd.create('circle', [o1, p1])
c2 = brd.create('circle', [o2, p2])

c3 = brd.create('circle', [m, o2], {
  strokeColor: 'green',
  strokeWidth: '1px',
})

创建两个圆c1c2,以及一个圆心连线lm。然后创建圆外公切圆c3,其圆心为m(两个原圆圆心的中点),半径为o2m的距离。

4. 求圆外公切圆与原圆的交点

i1 = brd.create('intersection', [c3, c4, 0], { visible: true })
i2 = brd.create('intersection', [c3, c4, 1], { visible: true })

使用intersection函数求出圆外公切圆c4与原圆c1c2的交点i1i2

5. 绘制圆外公切圆的切线和半径

l1 = brd.create('line', [o1, i1], { visible: false })
l2 = brd.create('line', [o1, i2], { visible: false })

i3 = brd.create('intersection', [c1, l1, 0], { visible: true })
i4 = brd.create('intersection', [c1, l2, 0], { visible: true })

v1 = brd.create('arrow', [o1, i3], {
  strokeColor: 'lightblue',
  strokeWidth: '1px',
})
v2 = brd.create('arrow', [o1, i4], {
  strokeColor: 'lightblue',
  strokeWidth: '1px',
})

l3 = brd.create('line', [i1, o1], { visible: false })
l4 = brd.create('line', [o1, i2], { visible: false })

t1 = brd.create('tangent', [c1, i3], { strokeColor: 'darkblue' })
t2 = brd.create('tangent', [c1, i4], { strokeColor: 'darkblue' })

t3 = brd.create('line', [o2, i1], { strokeColor: 'pink' })
t4 = brd.create('line', [o2, i2], { strokeColor: 'pink' })

创建辅助线l1l2,并求出它们与原圆c1的交点i3i4。然后绘制圆外公切圆的切线t1t2,以及连接圆心o2和交点i1i2的线段t3t4

总结与展望

通过这段代码,我们可以直观地绘制圆外公切圆,并探索其性质。在开发过程中,我收获了以下经验:

  • 掌握JSXGraph库的使用,提高了图形绘制能力。
  • 加深了对圆外公切圆的理解,提升了几何知识。

未来,可以考虑拓展该代码的功能,例如:

  • 添加拖拽功能,允许用户交互式地移动圆和圆心连线。

  • 探索圆外公切圆的其他性质,如圆心连线垂直平分线段P1P2

    更多组件:



    获取更多Echos

    本文由ScriptEcho平台提供技术支持

    项目地址:传送门

    扫码加入AI生成前端微信讨论群:

扫码加入群聊

实现两外公切线交点计算,可以按照以下步骤进行: 1. 计算两心之间的距离,如果两相离或相切,则不存在外公切线; 2. 计算两心的连线与两的切点,得到切线的斜率; 3. 根据切线斜率和两心的位置,求出切线的方程; 4. 求出两心到切点的距离,即切线的截距; 5. 求解切线方程组,得到两条外公切线的交点。 以下是使用 C++ 实现两外公切线交点计算的代码示例: ```c++ #include <iostream> #include <cmath> using namespace std; struct Point { double x, y; }; struct Circle { Point center; double radius; }; // 计算两点之间的距离 double distance(Point p1, Point p2) { return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2)); } // 计算两的公切线的交点 void calcOuterTangent(Circle c1, Circle c2) { // 计算两心之间的距离 double d = distance(c1.center, c2.center); // 如果两相离或相切,则不存在外公切线 if (d > c1.radius + c2.radius || d < abs(c1.radius - c2.radius)) { cout << "No outer tangent." << endl; return; } // 计算两心的连线与两的切点,得到切线的斜率 double angle = atan2(c2.center.y - c1.center.y, c2.center.x - c1.center.x); double sinAngle = sin(angle); double cosAngle = cos(angle); // 根据切线斜率和两心的位置,求出切线的方程 double m1 = c1.radius * sinAngle - c2.radius * sinAngle; double n1 = c1.radius * cosAngle - c2.radius * cosAngle; double m2 = c1.radius * sinAngle + c2.radius * sinAngle; double n2 = c1.radius * cosAngle + c2.radius * cosAngle; // 求出两心到切点的距离,即切线的截距 double b1 = c1.center.y - m1 / n1 * c1.center.x; double b2 = c2.center.y - m2 / n2 * c2.center.x; // 求解切线方程组,得到两条外公切线的交点 double x = (b2 - b1) / (m1 / n1 - m2 / n2); double y = m1 / n1 * x + b1; cout << "The intersection point of outer tangents is: (" << x << ", " << y << ")." << endl; } int main() { Circle c1 = {{0, 0}, 2}; Circle c2 = {{5, 0}, 3}; calcOuterTangent(c1, c2); return 0; } ``` 上述代码中,我们定义了两个结构体 Point 和 Circle,分别表示点和。distance 函数用于计算两点之间的距离。calcOuterTangent 函数用于计算两外公切线的交点。在主函数中,我们定义了两个,并调用 calcOuterTangent 函数计算它们的外公切线的交点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值