- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个椭圆,其中点为“mid”,水平半径为“h”,垂直半径为“v”,还有一个 Line2D。
现在我需要一些代码来计算两者的两个交点。我已经尝试过一些代码并自己尝试过,但总是会出错。
有人有一些工作代码吗?
最佳答案
你需要用代数来解这两个方程,而且会有点乱。首先你必须写出椭圆
(1) (x/h)^2 + (y/v)^2 = 1
和格式中的行
(2) y = ax + b
首先,在坐标轴上移动,使椭圆以原点为中心。您可以通过从该行中减去 mid 来做到这一点。计算出交点后,通过添加 mid 将它们移回。
您可以从线的起点和终点计算 delta-y/delta-x 的线性斜率。您将必须检查斜坡是否垂直。如果斜率是垂直的,你只需要检查线点的x值是否落在椭圆的位置,然后很容易计算出这些值。在纸上画出来,看看如何计算。
现在假设斜坡不是垂直的。由于您根据直线中的 x 知道 y,将其平方并代入 (1)。化简给出二次方程。
(3) ((ah)^2+v^2)x^2 + (2abh^2)x + ((hb)^2-(hv)^2) = 0
使用二次公式给出交叉点 x 坐标的两个值。如果 x 有两个实数值,则有两个交点。如果 x 只有一个实数解,则存在一个交集。如果 x 没有实解,则不存在交集。
给定 ax^2+ bx + c = 0, x 由
x = (1/2a)(-b +- Sqrt(b^2 - 4ac))
令 D = b^2 - 4ac
如果D < 0,则没有交叉点
如果D = 0,则有一个路口
如果D > 0,则有两个交点
计算出 x 交集的值后,将 x 的值代入 (2) 以获得 y 值。
现在,您需要确保这些点落在直线内。为此,只需检查计算点的 x 和 y 分量是否满足 x1 <= x <= x2 和 y1 <= y <= y2 其中 x1 是最小的,x2 是直线的最大 x 端点,y1是最小的,y2 是直线的最大 y 端点。
这是我做的一个示例方法
public static ArrayList<Point2D> getIntersection(double x1, double x2, double y1, double y2, double midX, double midY, double h, double v) {
ArrayList<Point2D> points = new ArrayList();
x1 -= midX;
y1 -= midY;
x2 -= midX;
y2 -= midY;
if (x1 == x2) {
double y = (v/h)*Math.sqrt(h*h-x1*x1);
if (Math.min(y1, y2) <= y && y <= Math.max(y1, y2)) {
points.add(new Point2D(x1+midX, y+midY);
}
if (Math.min(y1, y2) <= -y && -y <= Math.max(y1, y2)) {
points.add(newPoint2D(x1+midX, -y+midY);
}
}
else {
double a = (y2 - y1) / (x2 - x1);
double b = (y1 - a*x1);
double r = a*a*h*h + v*v;
double s = 2*a*b*h*h;
double t = h*h*b*b - h*h*v*v;
double d = s*s - 4*r*t;
if (d > 0) {
double xi1 = (-s+Math.sqrt(d))/(2*r);
double xi2 = (-s-Math.sqrt(d))/(2*r);
double yi1 = a*xi1+b;
double yi2 = a*xi2+b;
if (isPointInLine(x1, x2, y1, y2, xi1, yi1)) {
points.add(new Point2D.Double(xi1+midX, yi1+midY);
}
if (isPointInLine(x1, x2, y1, y2, xi2, yi2)) {
points.add(new Point2D.Double(xi2+midX, yi2+midY);
}
}
else if (d == 0) {
double xi = -s/(2*r);
double yi = a*xi+b;
if (isPointInLine(x1, x2, y1, y2, xi, yi)) {
points.add(new Point2D.Double(xi+midX, yi+midY));
}
}
}
return points;
}
public static boolean isPointInLine(double x1, double x2, double y1, double y2, double px, double py) {
double xMin = Math.min(x1, x2);
double xMax = Math.max(x1, x2);
double yMin = Math.min(y1, y2);
double yMax = Math.max(y1, y2);
return (xMin <= px && px <= xMax) && (yMin <= py && py <= yMax);
}
请随意检查我的代数和我的代码,但你应该通过仔细完成每个代数步骤来解决这个问题。
关于java - 椭圆和直线相交JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24164485/
这一章实现的连接线,目前仅支持直线连接,为了能够不影响原有的其它功能,尝试了2、3个实现思路,最终实测这个实现方式目前来说最为合适了。 请大家动动小手,给我一个免费的 Star 吧~ 大家
本章分享一下如何使用 Konva 绘制基础图形:矩形、直线、折线,希望大家继续关注和支持哈! 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue
本章响应小伙伴的反馈,除了算法自动画连接线(仍需优化完善),实现了可以手动绘制直线、折线连接线功能。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Is
我有一条线(两点(x,y)(x1,y1))和一个带有焦点(rx,ry)的矩形。我需要帮助找出线和矩形之间的碰撞点,C++ 中的一个例子会有所帮助。 最佳答案 我不知道如何仅用“焦点”来表示矩形。您将需
让我们画一条线和一个圆: canvas.create_line(x0,y0,x1,y1) canvas.create_oval(x0,y0,x1,y1) 如何计算每个像素的像素数? 最佳答案 你不能。
本文实例讲述了php使用gd2绘制基本图形。分享给大家供大家参考,具体如下: 应用GD2函数可以绘制的图形有多种,最基本的图形包括条、圆、方形等。无论开发人员绘制多么复杂的图形,都是在这些最基本的
我已经尝试了所有改变颜色的方法: call s:h("Underlined", {"fg": s:norm, "gui": "underline", "cterm": "underline"})
为什么以下行有时会在 chrome 开发控制台中产生消息“未定义不是函数”: (callbackOrUndefined || function() {})(); 这个想法是,如果回调为真,即函数,则执
我想在 MS Chart 中实现直线(分段拟合)图表。 我知道 X 轴上的点 [最小值 = 1.4,最大值 = 2.2]。我已将所有这些点都放在折线图上。 现在的要求是我如何知道 X 轴上的点 [最小
所以我正在使用 charts.js http://www.chartjs.org/我试图使 2 个点之间的线是直线而不是弯曲的,没有明显的原因。 现在看起来是这样的 http://imgur.com/
我已将我的机器人发布到 Azure。现在我要开发自己的聊天用户界面。我想在 JavaScript 中使用 Direct Line API 来调用机器人。 如何在 JavaScript 中使用 Dire
这个有点难解释。我有一个整数列表。因此,例如,[1, 2, 4, 5, 8, 7, 6, 4, 1] - 当根据元素编号绘制时,它类似于凸图。我如何以某种方式从列表中提取此“形状”特征?它不必特别准确
我在学习 javaScript 和 jQuery 的第一周,我正在尝试制作一些动画。 基本上我想要做的就是让这些箭头从屏幕开始,从一侧进入,通过 throw 目标,然后离开屏幕的另一侧。 理想情况下,
假设我有一个向导并且有 3 个部分,假设它是这样的。 [A]----[B]----[C] 假设当前在范围内选择了 A。这是一个彩色的红色圆圈。当 B 在范围内被选中时,就可以移动一个对象(假设一条彩色
我正在使用 botframework-directlinejs NodeJS SDK 为我的机器人前端实现一个新 channel 。该 channel 将提供一些自定义反向 channel 功能;但是
我正在使用直线执行 hql 查询。该作业似乎没有出现在 HDP 2.6 上 Spark History 服务器的资源管理器中。如何让它运行在 Yarn 上? 谢谢 最佳答案 Beeline 是一个 A
我目前正在尝试找到一种如何使用 Google Maps Api V3 获得直线路线的方法。 我已经设法使用地理编码和方向服务来获取从 A 点到 B 点的路线,包括两条替代路线。我还尝试过“无高速公路”
我有一个简单的 Canvas html5。它可以通过选择选项绘制一些形状,如直线、圆形、矩形、多边形,但现在我想让所有绘制都可拖动(如果可能的话)可调整大小,没有 3 部分库,只有纯 JS。
我正在使用在 Kerberos 中添加的帐户启动 beeline 来测试 Sentry: beeline -u "jdbc:hive2://IP:10000/;principal=test_table
我正在使用普通的 html/javascript Canvas (无库)。我有一种从两点计算 Angular 方法,我的理论是,我获取 Angular 并通过循环所需的水平距离 (x) 并对该 Ang
我是一名优秀的程序员,十分优秀!