最近在做一個專案,放下工件時的工件所處位置與設計值不符合,
想做一個軟體的補償程式。
通過測量工件的兩個角的坐標資料,來求出工件工件的中心點XY偏移量與旋轉角度。
希望能有經驗者指教一下,謝謝
uj5u.com熱心網友回復:
求角度當應用三角形知識可求得uj5u.com熱心網友回復:
這種初中的幾何應用我都還給數學老師了,你可以問她要回來.uj5u.com熱心網友回復:
比如說上左代表A,上右代表B,下左代表C,下右代表D, X和Y是容器坐標, 偏移量根據現在-原來的就能得到;x-x y-y旋轉角度,By-Ay=三角形直角高度,Bx-Ax=三角形斜面長度, 求出長度,在計算角度就不是問題了, 三角形公式忘了,你自己找吧
uj5u.com熱心網友回復:
/// <summary>
/// 根據兩點坐標計算偏移及旋轉量
/// </summary>
/// <param name="Pos"></param>
/// <param name="result"></param>
public void CalculateOffset(double[] Pos, ref double[] result)
{
double result1, result2, result3, result4;
double result11, result22, result33, result44;
double result111, result222, result333, result444;
double offset1, offset2, offset3;
result[0] = 0;
result[1] = 0;
result[2] = 0;
if (Pos.Length != 8)
return;
double angle1;
double angle2;
double offsetx1 = Pos[2] - Pos[0];
double offsety1 = Pos[3] - Pos[1];
double offsetx2 = Pos[6] - Pos[4];
double offsety2 = Pos[7] - Pos[5];
if (offsetx1 == 0)
{
if (offsety1 > 0)
angle1 = 90;
else
angle1 = 270;
}
else
angle1 = (180 / Math.PI) * Math.Atan(offsety1 / offsetx1);
if (offsetx2 == 0)
{
if (offsety2 > 0)
angle2 = 90;
else
angle2 = 270;
}
else
angle2 = (180 / Math.PI) * Math.Atan(offsety2 / offsetx2);
double resultangle;
double resultangle1 = (angle2 - angle1);
double resultangle2 = (angle2 - angle1) + 180;
double resultangle3 = (angle2 - angle1) - 180;
resultangle = resultangle1 * Math.PI / 180;
result1 = Pos[4] - Math.Cos(resultangle) * Pos[0] + Math.Sin(resultangle) * Pos[1];
result2 = Pos[5] - Math.Sin(resultangle) * Pos[0] - Math.Cos(resultangle) * Pos[1];
result3 = Pos[6] - Math.Cos(resultangle) * Pos[2] + Math.Sin(resultangle) * Pos[3];
result4 = Pos[7] - Math.Sin(resultangle) * Pos[2] - Math.Cos(resultangle) * Pos[3];
offset1 = Math.Abs(result3 - result1) + Math.Abs(result4 - result2);
resultangle = resultangle2 * Math.PI / 180;
result11 = Pos[4] - Math.Cos(resultangle) * Pos[0] + Math.Sin(resultangle) * Pos[1];
result22 = Pos[5] - Math.Sin(resultangle) * Pos[0] - Math.Cos(resultangle) * Pos[1];
result33 = Pos[6] - Math.Cos(resultangle) * Pos[2] + Math.Sin(resultangle) * Pos[3];
result44 = Pos[7] - Math.Sin(resultangle) * Pos[2] - Math.Cos(resultangle) * Pos[3];
offset2 = Math.Abs(result33 - result11) + Math.Abs(result44 - result22);
resultangle = resultangle3 * Math.PI / 180;
result111 = Pos[4] - Math.Cos(resultangle) * Pos[0] + Math.Sin(resultangle) * Pos[1];
result222 = Pos[5] - Math.Sin(resultangle) * Pos[0] - Math.Cos(resultangle) * Pos[1];
result333 = Pos[6] - Math.Cos(resultangle) * Pos[2] + Math.Sin(resultangle) * Pos[3];
result444 = Pos[7] - Math.Sin(resultangle) * Pos[2] - Math.Cos(resultangle) * Pos[3];
offset3 = Math.Abs(result333 - result111) + Math.Abs(result444 - result222);
if (offset3 < offset1 && offset3 <= offset2)
{
result[0] = result111;
result[1] = result222;
result[2] = resultangle3;
}
else if (offset2 < offset1 && offset2 <= offset3)
{
result[0] = result11;
result[1] = result22;
result[2] = resultangle2;
}
else
{
result[0] = result1;
result[1] = result2;
result[2] = resultangle1;
}
}
uj5u.com熱心網友回復:
這個很簡單啊,放正切函式就行了,double r = Math.Atan(20 / 20);
不過看你旋轉的角度,你的測量值似乎有問題啊。 另外還有一因旋轉而產生的平移問題,你需要套公式了。給你一個矢量演算法供參考。
'******(x1,y1)為要旋轉的任意點,(x2,y2)為旋轉中心點,如果是順時針角度為θ,(x,y)為旋轉后的新坐標 **
'****** x=(x1-x2)cosθ- (y1-y2)sinθ+x2 **
'****** y=(x1-x2)sinθ+ (y1-y2)cosθ+y2
uj5u.com熱心網友回復:
不就是反三角函式,三角函式的事情么?測出同一條邊兩個頂點值,計算出兩點間的水平和垂直偏差,就可以算出旋轉角度,根據旋轉角度就可以算出中心點的相對坐標,進而計算出偏差。uj5u.com熱心網友回復:
非常感謝!!!轉載請註明出處,本文鏈接:https://www.uj5u.com/net/6809.html
標籤:C#
上一篇:winform wpf的webbrowser如何支持 vue es6
下一篇:如何安裝vs2019?
