Math 使用d3检查三角形高度的逻辑

Math 使用d3检查三角形高度的逻辑,math,d3.js,geometry,2d,computational-geometry,Math,D3.js,Geometry,2d,Computational Geometry,这表明我在工作 在jsbin中,我试图通过点a(1,1)画一条垂直于点B(6,18)和点C(14,6)的线BC的高度线 我解决这个问题的方法是尝试将两个方程转换成y=mx+c的形式,然后将它们重新排列为y-mx=c,然后使用矩阵通过联立方程求解它们 我有一个海拔高度函数来完成这项工作: function altitude(vertex, a, b) { var slope = gradient(a, b), x1 = - slope, y1 = 1, c1

这表明我在工作

在jsbin中,我试图通过点a(1,1)画一条垂直于点B(6,18)和点C(14,6)的线BC的高度线

我解决这个问题的方法是尝试将两个方程转换成
y=mx+c
的形式,然后将它们重新排列为
y-mx=c
,然后使用矩阵通过联立方程求解它们

我有一个海拔高度函数来完成这项工作:

function altitude(vertex, a, b) {
  var slope = gradient(a, b),
      x1 = - slope,
      y1 = 1,
      c1 = getYIntercept(a, slope),
      perpendicularSlope = perpendicularGradient(a, b),
      x2 = - perpendicularSlope,
      y2 = 1,
      c2 = getYIntercept(vertex, perpendicularSlope);
  
  var matrix = [
    [x1, y1],
    [x2, y2]
  ];
  
  var result = solve(matrix, [c1, c2]);
  
  var g = svg.append('g');

  g.append('line')
    .style('stroke', 'red')
    .attr('class', 'line')
    .attr('x1', xScale(vertex.x))
    .attr('y1', yScale(vertex.y))
    .attr('x2', xScale(result.x))
    .attr('y2', yScale(result.y));
} 
我首先用这个函数得到BC的梯度

var gradient = function(a, b) {  
  return (b.y - a.y) / (b.x - a.x);
};
这是-1.5,由此我可以用这个函数得到垂直梯度:

var perpendicularGradient = function (a, b) {
  return -1 / gradient(a, b);
};
我把它设为0.66666或(2/3)

我得到的两个方程如下所示:

y + 1.5 = 27
y -0.6666666666666666 = 0.33333333333333337
我在jsbin中有一些函数,它们将使用矩阵和cramer规则同时解决这些问题,主要的是解决:

function solve(matrix, r) {
   var determinant = det(matrix);
   var x = det([
      [r[0], matrix[0][1]],
      [r[1], matrix[1][1]]
    ]) / determinant;
  
   var y = det([
     [matrix[0][0], r[0]],
     [matrix[1][0], r[1]]
   ]) / determinant;
  
  return {x: Math.approx(x), y: Math.approx(y)};
}

function det(matrix) {
  return (matrix[0][0]*matrix[1][1])-(matrix[0][1]*matrix[1][0]);
}
我得到了截距的坐标,大概是(12.31,8.54)

问题是,它在图表上看起来不正确


我是不是走错了一步?我认为我的计算是对的,但我不排除他们是错的。可能会缩小比例。

您希望找到点A到线BC的投影

让我们制作向量
Q=C-B
P=A-B
标准化(单位长度):
uQ=Q/|Q|

所需投影点D
D=B+uQ*点产品(PuQ

比如你的例子A(1,1),B(6,18),C(14,6)

Q=(8,-12)
|Q|=Sqrt(8*8+12*12)~14.4
uQ=(0.55,-0.83)
P=(-5,-17)
点积(PuQ)=0.55*(-5)-(0.83*-17)=11.39
D=(6+0.55*11.39,18-0.83*11.39)=(12.26,8,54)

所以,您的计算给出了正确的结果(虽然这种方法不是很有效),但图片并不精确-X轴和Y轴的不同比例会使角度变形


p.S:第二行
width=660-margin.left-margin.right,
使图片更可靠

我没有遇到矢量。在你的照片上,比例有什么不同?在OY轴上,20个单位约为10厘米,在OX轴上约为17厘米。试着在网格纸上画画哈,你是对的,我有不同的比例。非常感谢。使用向量的数学技术是什么?你有链接吗?