- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在椭圆内部射出一条光线,它需要反射出椭圆并继续在椭圆内飞行。我发现最简单的方法可能是找到撞击点的切线 vector ,然后从那里计算反射角。
虽然我不确定如何在代码中实现它。
这是我目前所拥有的,我有以下函数绘制椭圆及其半长轴 (a) 和半短轴 (b)。 t 在更新函数中递增。
void drawEllipse(float t) {
float x = a * cos(t);
float y = b * sin(t);
PVector ellipseDotPosition = new PVector(x, y).add(ellipseCenter);
circle(ellipseDotPosition.x, ellipseDotPosition.y, 2);
}
我使用此函数确定射线是否发生碰撞:
boolean hasCollided(PVector pointToCheck) {
return pow((pointToCheck.x - ellipseCenter.x) / a, 2) +
pow((pointToCheck.y - ellipseCenter.y) / b, 2) > 1;
}
这是我尝试计算反射 vector 的方法。
PVector getReflectionVector(PVector pointOfImpact) {
// Differentiate to get tangent to the collision point.
// PVector tangent = new PVector(-a / b * pointOfImpact.y, b / a * pointOfImpact.x);
// PVector tangent = new PVector(-(a * pointOfImpact.y / b), (b * pointOfImpact.x / a));
// circle(tangent.x, tangent.y, 10);
// Treat the tangent as the surface to be reflected off.
// Determine angle of reflection off the surface.
// Return reflection vector.
return new PVector();
}
我数学不好吗?是的。请帮助:)
最佳答案
接下来是什么wikipedia说:
Analytically, the equation of a standard ellipse centered at the origin with width 2a and height 2b is:
其中,如果我们对其求导(返回其在该点的切线),结果是:
导数仅适用于以 (0, 0) 为中心的椭圆。
另请注意,如果 y = 0,您将得到一个异常。这是因为它会给出无穷大,因为切线是完全垂直的。
// OriginalRay will be the direction of the colliding ray.
// You may also define the origin as the last collision point.
PVector getReflectionVector(PVector pointOfImpact, PVector originalRay){
// Differentiate to get tangent to the collision point.
// atan() to get angle of tangent line from 0X
float tangentAngle;
if(pointOfImpact.y != 0){
float tangent = -1*pointOfImpact.x*sq(b)/(pointOfImpact.y*sq(a));
tangentAngle = atan(tangent);
}else{
tangentAngle = PI/2;
}
// Treat the tangent as the surface to be reflected off.
// Determine angle of reflection off the surface.
float rayAngle = atan2(originalRay.y, originalRay.x);
// We now transform the case as it had collided on an horizontal surfface to simplify.
//float tempRayAngle = rayAngle - tangentAngle;
// Calc the reflectionAngle
//float tempReflectionAngle = PI - tempRayAngle;
// And undo the transformation
//float newRayAngle = rayAngle - tempReflectionAngle;
float newRayAngle = 2*rayAngle - tangentAngle - PI; //End result
// Return reflection vector. (The direction vector with abs() = 1)
PVector reflectedRay = new PVector(cos(newRayAngle), sin(newRayAngle));
return reflectedRay;
}
关于java - 确定从切线到椭圆的反射 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66917813/
许多贴图技术包括法线凹凸贴图、视差贴图和其他需要特殊的每顶点切线空间基础(切线、法线、副法线/双切线)。 这显然意味着我的模型不仅应该导出 顶点位置 , 纹理坐标和 近似每顶点法线 ,但也是切线空间基
如何绕过函数tan(x)未定义的角度,即x != Pi/2 + k * PI ? 我尝试使用条件: (x != 0) && (2 * x / M_PI - (int)(2 * x / M_PI ) )
我想绘制一个简单的图示,说明如何使用导数找出函数在任意点的斜率。它看起来有点像这样: 我已经使用这段代码绘制了一个简单的抛物线: import numpy as np from matplotlib
给定两个函数,我想找出两条曲线的公切线: 公切线的斜率可以通过以下方式获得: slope of common tangent = (f(x1) - g(x2)) / (x1 - x2) = f'(x1
我知道 tan(angle) 让我得到切线。但是,如何进行“反向切线”,以便在给定直角三角形两边长度的情况下得到角度? 我假设在 math.h 中有一个方法? 最佳答案 正如其他人所提到的,atan(
我是一名优秀的程序员,十分优秀!