如何在典型的编程语言中使用逗号表示法来表示用于二维点计算的向量代数?

问题描述

我最近在 math.stackexchange.com 上寻求帮助,有一个关于二维代数的问题。很快就提供了答案,但它采用了我不熟悉的数学符号,而且给出答案的人已停止回答我的问题。虽然我非常感谢 BStar 提供这些信息,但他/她已经停止在网站和聊天中回复,并且似乎没有兴趣帮助我理解它以至于我可以编写编程代码来计算所需的点P。我尊重这一点,但这让我暂时陷入困境。有人能帮我把这一系列的步骤转换成一种编程语言,比如 Javascript 吗? (我实际上在 PHP 中工作,但是在 stackoverflow 上用可运行的代码段表示 Javascript 会更方便。我对我可以翻译成 PHP 的任何当前语言感到满意。

帖子位于https://math.stackexchange.com/questions/4110517/trig-101-calculate-coords-of-point-p-such-that-it-is-distance-n-from-line-ab-an/4110550?noredirect=1#comment8504010_4110550

给出的答案在 Latex 中,但这是它的屏幕截图:

enter image description here

作者BStar对过程的最新描述:“这里是过程:首先计算cos B并使用arccos得到B。第二次计算tanθ以使用arctan得到θ,使用|BP|是相同的两个三角形. 知道这些,我们可以得到向量 BA' 和 B'P,因此向量 OA 和 OP。在这种情况下,我们可以得到 θ 到 grt 向量 BA',而不是相反。”

我可以跟进直到第 (5) 步出现逗号符号,即 k = (-xb,-yb)(xc - xb,yc - yb) / ac。这似乎使 k 成为二维向量,但我认为我从未使用过这种表示法。后来,k 用于步骤 (6)(6a) 来计算 theta,出现在分数的分子和分母中。我不知道如何扩展它以获得 theta 的实际值。

(Edit 注意:作者 BStar 假设点 A 在原点,所以 (xa,ya) = (0,0) 但我不能在现实世界中做出这个假设。因此向量 BA Step 1中的实际上是(xa - xb,ya - yb),他上面显示k的公式实际上是k = (xa - xb,ya - yb)(xc - xb,yc - yb) / ac。这个扩展需要通过计算进行,但不是大的变化。)

如果我们用 Javascript 来构建这个框架,我可以在计算开始时制定一个已知的框架。 BStar给出的数学证明的每一步都表示不是很有成效,但我不确定具体哪些步骤可以作为数学证明中的过程以及哪些步骤需要在代码中阐述。

/* KNown points - A,B,C */
var xa = 10,ya = 10;
var xb = 100,yb = 500;
var xc = 700,yc = 400;

/* KNown lengths m and n (distance perpendicularly from AB and AC) */
var m = 30;
var n = 50;

/* Point we want to calculate,P */
var px = 0,py = 0;

/* Calculation goes here - some Javascript notes:
 * var a = Math.sin(angInradians);
 * var b = Math.asin(opposite / hypotenuse);
 * var c = Math.pow(number,2); // square a number
 * var d = Math.sqrt(number);
 */

/* Print the result */
console.log('Result: P (' + px + ',' + py + ')');

如何表达上面编程片段中图表中的数学?

解决方法

我想我可以让你到达 B 的角度,但我数学不太好,并且对所有这些变量迷失了方向。如果您在确定角度时遇到困难,请尝试此操作,看看它是否符合您的要求。它似乎按照第 5 步的要求执行,但请仔细检查我的工作。

let pointA = {x: 100,y: 0};
let pointB = {x: 20,y: 20};
let pointC = {x: 0,y: 100};

let distBA_x = pointB.x - pointA.x;
let distBA_y = pointB.y - pointA.y;
//let BA_a = Math.sqrt(distBA_x*distBA_x + distBA_y*distBA_y);

let distBC_x = pointB.x - pointC.x;
let distBC_y = pointB.y - pointC.y;
//let BC_c = Math.sqrt(distBC_x*distBC_x + distBC_y*distBC_y);

var angle = Math.atan2(distBA_x * distBC_y - distBA_y * distBC_x,distBA_x * distBC_x + distBA_y * distBC_y);
if(angle < 0) {angle = angle * -1;}
var degree_angle = angle * (180 / Math.PI);

console.log(degree_angle)

我已将其布置在画布上,以便您可以直观地看到它并更改参数。希望能帮助到你。这是 Codepen https://codepen.io/jfirestorm44/pen/RwKdpRw

,

BA • BC 是两个向量之间的“点积”。结果是一个数字:它是向量分量的乘积之和。如果向量是 (x1,y1) 和 (x2,y2),点积是 x1x2+y1y2。

假设您没有用于向量计算的库并且不想创建一个库,那么计算 k 的代码将是:

k = (-xb*(xc - xb)-yb*(yc - yb)) / ac