Math 按给定角度计算点的中值

Math 按给定角度计算点的中值,math,geometry,Math,Geometry,我正在编程一棵树来划分二维空间。 因此,我需要根据给定的角度将当前的点集分成两个相等的部分。因此,下图中的黑线穿过计算出的中值 正如我们在图像中看到的,由给定角度和计算的中值定义的线远离将集合划分为两个相等部分。该线应更向右切割x轴,因为现在只有约25个点位于该线左侧,约55个点位于右侧 我已经知道了,我必须使用点的角度来计算中值 我计算中值的第一种方法是将所有点旋转给定角度,然后使用它们与x轴的角度,但这显然是不够的 我并不是为了得到正确的中值计算而对点进行具体的变换,所以任何帮助/提示都将不

我正在编程一棵树来划分二维空间。 因此,我需要根据给定的角度将当前的点集分成两个相等的部分。因此,下图中的黑线穿过计算出的中值

正如我们在图像中看到的,由给定角度和计算的中值定义的线远离将集合划分为两个相等部分。该线应更向右切割x轴,因为现在只有约25个点位于该线左侧,约55个点位于右侧

我已经知道了,我必须使用点的角度来计算中值

我计算中值的第一种方法是将所有点旋转给定角度,然后使用它们与x轴的角度,但这显然是不够的

我并不是为了得到正确的中值计算而对点进行具体的变换,所以任何帮助/提示都将不胜感激

非常感谢

在哪里

Theta = Pi/2 + Fi 
Fi是你给定的角度。 您必须找到合适的p值来将点集划分为两个相等的部分

签名是

按D[i]值对点阵列进行排序并找到中值。 若点号为奇数,则将D[中值]作为直线方程的p,否则您可以选择D[左中值]和D[右中值]之间的任意p值

示例: 5个点,D=-3,-1,4,5,8-获得p=4条线通过一个点 6点,D=-3,-1,2,5,7,9-得到范围]2..5[不包括这些值]内的任何p

编辑:奇偶点数的两个示例:

德尔福代码:

var
  Pt: TArray<TPoint>;
  D: TArray<Double>;
  N, i: Integer;
  Fi, Theta, p: Double;
begin
  Randomize;
  N := 7 + Random(2); // number of points, 7 or 8
  Fi := Pi / 4;   //line slope angle
  Theta := Pi / 2 + Fi;
  SetLength(Pt, N);   //point cloud
  SetLength(D, N);    //distance params
  Canvas.FillRect(ClientRect);

  //generate random points and draw them
  for i := 0 to N - 1 do begin
    Pt[i] := Point(Random(400), Random(400));
    Canvas.Rectangle(Pt[i].X - 2, Pt[i].Y - 2, Pt[i].X + 3, Pt[i].Y + 3);
  end;

  //fill param array
  for i := 0 to N - 1 do
    D[i] := Pt[i].X * Cos(Theta) + Pt[i].Y * Sin(Theta);

  //sort distance parameters
  TArray.Sort<Double>(D);

  //get line parameter as median of array
  if Odd(N) then
    p := D[N div 2]
  else
    p := (D[N div 2 - 1] + D[N div 2]) / 2;

  //draw calculated line
  Canvas.MoveTo(0, Round(p / Sin(Theta)));
  Canvas.LineTo(500, Round((p - 500 * Cos(Theta)) / Sin(Theta)));

为什么旋转点不起作用?我仍然无法找到合适的p值
D = Q.X * Cos(Theta) + Q.Y * Sin(Theta) - p
var
  Pt: TArray<TPoint>;
  D: TArray<Double>;
  N, i: Integer;
  Fi, Theta, p: Double;
begin
  Randomize;
  N := 7 + Random(2); // number of points, 7 or 8
  Fi := Pi / 4;   //line slope angle
  Theta := Pi / 2 + Fi;
  SetLength(Pt, N);   //point cloud
  SetLength(D, N);    //distance params
  Canvas.FillRect(ClientRect);

  //generate random points and draw them
  for i := 0 to N - 1 do begin
    Pt[i] := Point(Random(400), Random(400));
    Canvas.Rectangle(Pt[i].X - 2, Pt[i].Y - 2, Pt[i].X + 3, Pt[i].Y + 3);
  end;

  //fill param array
  for i := 0 to N - 1 do
    D[i] := Pt[i].X * Cos(Theta) + Pt[i].Y * Sin(Theta);

  //sort distance parameters
  TArray.Sort<Double>(D);

  //get line parameter as median of array
  if Odd(N) then
    p := D[N div 2]
  else
    p := (D[N div 2 - 1] + D[N div 2]) / 2;

  //draw calculated line
  Canvas.MoveTo(0, Round(p / Sin(Theta)));
  Canvas.LineTo(500, Round((p - 500 * Cos(Theta)) / Sin(Theta)));