110,535
社区成员
发帖
与我相关
我的任务
分享
有一个点在(x,y)
算法
x*x+y*y=z*z(z为长边)
假设要旋转p度
先求出最长边。。
即
z*z=x*x+y*y;
即最长边恒定长度。。 且可将这个与坐标轴原定看做直角三角形
使用cos 来求出x坐标 因为最长边恒定 根据三角形 x*x+y*y=z*z
void count3(float x,float y,float point)
{
float z=x*x+y*y;//求出最长边。
//求出夹角
var _point =(x*x+z*z-y*y)/2/x/z;
var new_point=_point+point;
x*x+(z*z-x*x)=z*z;
//算法暂时没有弄明白。。ps泰勒展开公式
}
/// <summary>
/// 获取点绕旋转点旋转
/// </summary>
/// <param name="rotatePt">中心旋转点</param>
/// <param name="angle">旋转角度</param>
/// <param name="pt">要旋转的点</param>
/// <returns></returns>
public static PointF GetRotatedPoint(PointF rotatePt, float angle, PointF pt)
{
Matrix matrix = new Matrix();
matrix.RotateAt(angle, rotatePt);
PointF[] pts = new PointF[] { pt };
matrix.TransformPoints(pts);
matrix.Dispose();
return pts[0];
}
var angle = 45.0 / 180 * Math.PI;
var x = p.X * Math.Cos(angle) - p.Y * Math.Sin(angle); //-194.4544
var y = p.X * Math.Sin(angle) + p.Y * Math.Cos(angle); // 300.5204
对于你的算法一,由于含有未公开的自定义成分,无法测试。但从结果上看,算法上是小有错误的
对以你的算法二、三,你违背了基本规则:Math 再计算三角函数时,使用的是弧度而不是角度。当然结果就不会正确
请注意,旋转是有方向的
Math.Sqrt(75 * 75 + 350 * 350) = 357.9455
Math.Sqrt(-194.4544 * -194.4544 + 300.5204 * 300.5204) = 357.9455
public static double GetAngle(int X1, int Y1, int X2, int Y2)
{
double angleOfLine = Math.Atan2((X2 - X1), (Y2 - Y1)) * 180.0d / Math.PI;
//+180°后0的起点是0点钟逆时针
return angleOfLine + 180.0d;
}
调用方法是
var r = GetAngle(132, 138, 105, 35);
里面的参数根据自己写。是两个点的坐标。
这个函数是根据两个点来获取角度(相对于时钟0点方向)
别看仅仅一句。很绕逻辑的。你把他反过来就是你要的公式了
var a1 = M.GetAngle(132, 138, 105, 35);
var a2 = M.GetAngle(132, 138, 53, 33);
var a3 = M.GetAngle(132, 138, 32, 95);
var a4 = M.GetAngle(132, 138, 47, 140);
var a5 = M.GetAngle(132, 138, 45, 195);
var a6 = M.GetAngle(132, 138, 199, 195);
var a7 = M.GetAngle(132, 138, 204, 95);
可以看出来前两个参数一直不变,因为他是原点的位置。不需要变