>  기사  >  백엔드 개발  >  0의 자율 학습 C#07--나선형 대기열 및 나선형 동작

0의 자율 학습 C#07--나선형 대기열 및 나선형 동작

黄舟
黄舟원래의
2017-02-04 10:46:121745검색

나선형 큐 로직 기반 나선형 모션 구현

나선형 큐 알고리즘의 역방향 방식은 아래 그림과 같이 2축 모터가 나선형 궤적을 따라 이동하도록 제어합니다.

0의 자율 학습 C#07--나선형 대기열 및 나선형 동작

1. 나선형 큐 알고리즘 분석

다음 그림은 나선형 큐입니다. 1의 좌표는 (0, 0)이고 x 방향은 오른쪽으로 양수, y 방향은 아래쪽으로 양수라고 가정합니다. 예를 들어 7의 좌표는 (-1, -1)이고 의 좌표는 다음과 같습니다. 2는 (1, 0)입니다. 프로그래밍을 통해 임의의 점의 좌표(x, y)를 입력하고 해당 숫자를 출력할 수 있습니다! (인터넷에서 재인쇄)

0의 자율 학습 C#07--나선형 대기열 및 나선형 동작


원당 최대값 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)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.