나선형 큐 로직 기반 나선형 모션 구현
나선형 큐 알고리즘의 역방향 방식은 아래 그림과 같이 2축 모터가 나선형 궤적을 따라 이동하도록 제어합니다.
1. 나선형 큐 알고리즘 분석
다음 그림은 나선형 큐입니다. 1의 좌표는 (0, 0)이고 x 방향은 오른쪽으로 양수, y 방향은 아래쪽으로 양수라고 가정합니다. 예를 들어 7의 좌표는 (-1, -1)이고 의 좌표는 다음과 같습니다. 2는 (1, 0)입니다. 프로그래밍을 통해 임의의 점의 좌표(x, y)를 입력하고 해당 숫자를 출력할 수 있습니다! (인터넷에서 재인쇄)
원당 최대값 max=(2*c+1)(2*c+1) , c 내부에서 외부로 회전한 횟수입니다.
이 기준값과 최대값의 차이는 1C(위), 3C(왼쪽), 5C(아래), 7C(오른쪽)(C는 현재 랩 번호를 나타냄), 상단과 하단에 있습니다. , y 좌표는 원의 수를 나타냅니다(즉, C=y). 반면 왼쪽과 오른쪽의 x 좌표는 원의 수(예: C=x)를 나타냅니다(또는 같습니다). 따라서 앞서 언급한 차이는 좌표를 이용하여 1y, 3x, 5y, 7x로 표현할 수 있다.
코드 구현:
private static Object spiral(int x, int y) { int c = max(abs(x), abs(y));// 当前坐标所在圈 int max = (c * 2 + 1) * (c * 2 + 1);// 当前圈上最大值 if (y == -c) { // 上边 return max + (x + y); } else if (x == -c) {// 左边 return max + (3 * x - y); } else if (y == c) {// 下边 return max + (-x - 5 * y); } else {// 右边 return max + (-7 * x + y); } }
2. 나선형 운동
먼저 PD의 논리적 위치를 나타내기 위해 좌표 연산을 사용자 정의합니다.
struct Coordinate { public int X; public int Y; public Coordinate(int a, int b) { X = a; Y = b; } public static bool operator ==(Coordinate loc1, Coordinate loc2) { return (loc1.X == loc2.X) && (loc1.Y == loc2.Y); } public static bool operator !=(Coordinate loc1, Coordinate loc2) { return !(loc1 == loc2); } public override bool Equals(object loc) { return this == (Coordinate)loc; } public override int GetHashCode() { return base.GetHashCode(); } public static Coordinate operator -(Coordinate loc1, Coordinate loc2) { return new Coordinate(loc1.X - loc2.X, loc1.Y - loc2.Y); } public static Coordinate operator +(Coordinate loc1, Coordinate loc2) { return new Coordinate(loc1.X + loc2.X, loc1.Y + loc2.Y); } public override string ToString() { return "(" + X + "," + Y + ")"; } }
그런 다음 반대 방법을 사용하여 단계 수를 기준으로 x 및 y 좌표를 계산합니다.
rree마지막으로 좌표 변화에 따른 움직임이 구현된다.
public Coordinate ToLocation(int step, int pulse) { int c = (int)Math.Ceiling((Math.Sqrt(step) - 1) / 2); int max = (int)Math.Pow(2 * c + 1, 2); int x, y; y = -c;//top x = -(max + y - step); if (Math.Abs(x) <= Math.Abs(y)) { this.location.X = x * pulse; this.location.Y = y * pulse; return this.location; } x = -c;//left y = max + 3 * x - step; if (Math.Abs(y) <= Math.Abs(x)) { this.location.X = x * pulse; this.location.Y = y * pulse; return this.location; } y = c;//bottom x = max - 5 * y - step; if (Math.Abs(x) <= Math.Abs(y)) { this.location.X = x * pulse; this.location.Y = y * pulse; return this.location; } x = c;//right y = -(max - 7 * x - step); this.location.X = x * pulse; this.location.Y = y * pulse; //LocChange(); return this.location; }
위 내용은 0-Spiral Queue와 Spiral Movement의 Self-Study C#07 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!