سؤال

وأتصور أن هذا هو سؤال بسيط، ولكن أنا الحصول على بعض النتائج غريبة مع قانون بلدي الحالي وليس لدي خلفية الرياضيات لنفهم تماما لماذا. هدفي هو بسيط، كما جاء في العنوان: أريد فقط للعثور على نقطة على مسافة وزاوية من وجهة نظر مركز

قانون بلدي الحالي:

Point centerPoint = new Point ( 0, 0 );
Point result      = new Point ( 0, 0 );
double angle      = 0.5; //between 0 and 2 * PI, angle is in radians
int distance      = 1000;

result.Y = centerPoint.Y + (int)Math.Round( distance * Math.Sin( angle ) );
result.X = centerPoint.X + (int)Math.Round( distance * Math.Cos( angle ) );

في عام، وهذا ما يبدو للعمل بشكل معقول إلى حد ما، ولكن يمكنني الحصول مشاكل في مختلف المناطق، وعلى الأخص عندما تقابل زاوية إلى نقطة في x السلبية والمحور الصادي. ومن الواضح أنني أفعل شيئا خاطئا - الأفكار حول ما الذي

وUPDATE: كان هذا خطأي، هذا الرمز يعمل على ما يرام - عدد قليل من القيم المتطرفة التي لا تعمل وكانت في الواقع نتيجة لخلل في الكيفية التي يتم بها حساب زاوية ل1.5PI. اعتقدت أنني قد تأكدت من أنه جيدا بما فيه الكفاية، ولكن كان من الواضح لا. شكرا للجميع على وقتهم، ونأمل رمز العمل فوق يثبت مفيدة لشخص آخر.

هل كانت مفيدة؟

المحلول

وأنت نسيت أن أضيف نقطة المركز:

result.Y = (int)Math.Round( centerPoint.Y + distance * Math.Sin( angle ) );
result.X = (int)Math.Round( centerPoint.X + distance * Math.Cos( angle ) );

ويجب أن يكون بقية طيب ... (ما هي النتائج غريبة وتحصل على؟ يمكنك ان تعطي مدخلا بالضبط؟)

نصائح أخرى

أولا، منذ كنت في راديان هو على الأرجح مفيدا لتحديد زاوية الخاص بك على هذا النحو:

double angle = (Math.PI / 3); // 60 degrees...

وظائف أنفسهم تعمل بشكل جيد. فإن التقريب يؤثر فقط إجابتك إذا المسافة التي تفصلك صغيرة بما فيه الكفاية بما فيه الكفاية. بخلاف ذلك، يجب على إجابات يخرج على ما يرام.

إذا انها في التقريب كنت قلقا، وتذكر أن افتراضيا، وصافي يفعل <لأ href = "http://blog.troyd.net/Bankers+Rounding+Vs+Common+Rounding+In+NET. ASPX "يختلط =" نوفولو noreferrer "> مصرفي في التقريب ، وكنت قد ترغب:

result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle), MidpointRounding.AwayFromZero);
result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle), MidpointRounding.AwayFromZero);

وبدلا من ذلك.

وبالإضافة إلى ذلك، في السؤال الذي تريد <م> المسافة X و Y زاوية ... أفترض أنك لا تتعلق ذلك إلى (X,Y) النقطة، لأن هذا هو مختلف تماما.

والصيغة المسافة:

double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2);

وA Swift3 نسخة

func pointOnCircle(radius: Double, angleInDegrees: Double, origin: CGPoint) -> CGPoint {
    let x = abs(Double(origin.x) + radius * cos(angleInDegrees * (.pi / 180)))
    let y = abs(Double(origin.y) - radius * sin(angleInDegrees * (.pi / 180)))

    return CGPoint(x: x, y: y)
}

وبدون مزيد من المعلومات حول الأخطاء بالضبط انه من الصعب معرفة ما هو الخطأ. المعادلات تبدو الصحيحة ويجب أن تعمل. هل أنت متأكد من الزوايا التي يتم تمريرها في صحيحة لزوايا> 90 درجة؟ ان الشيء الوحيد الذي كنت أفكر فيه أن يكون أنك مضاعفة المسافة (عدد صحيح) من قبل نتيجة لالرياضيات.خطيئة (مزدوجة) ولكن هذا لا ينبغي أن يكون حقا قضية.

-(NSMutableArray *)GetPointsForCircle
    {
       NSMutableArray *Points = [[NSMutableArray alloc] init];
       CGPoint CenterPoint = CGPointMake(160, 230);
       CGPoint Point;
       for (float Angel = 0; Angel <= 360; Angel+= 60)
         {
           Point.x = CenterPoint.x + 100 * cos(Angel);
           Point.y = CenterPoint.y + 100 * sin(Angel);
           [Points addObject:[NSValue valueWithCGPoint:Point]];
         }
       return Points;
    }

    - (CGPoint)pointOnCircle:(int)thisPoint withTotalPointCount:(int)totalPoints
     {
        CGPoint centerPoint = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2);
        float radius = 100.0;
        float angle = ( 2 * M_PI / (float)totalPoints ) * (float)thisPoint;
        CGPoint newPoint;
        newPoint.x = (centerPoint.x) + (radius * cosf(angle));
        newPoint.y = (centerPoint.y) + (radius * sinf(angle));
        return newPoint;   
    }

وأنا لا أعرف ج #، على أية حال إذا كنت تحاول رسم النقاط في مكان ما لديك للنظر في حقيقة أن Y محور تجعد من أعلى إلى أسفل الشاشة، لذلك صفحة الخطيئة يجب أن يكون العنصر تكون على -sin (...) وليس <م> + خطيئة (...)

وهكذا

result.Y = centerPoint.Y + (int)Math.Round( distance * Math.Sin( angle ) );

وينبغي أن تصبح:

result.Y = centerPoint.Y - (int)Math.Round( distance * Math.Sin( angle ) );

إذا كنت لا تحاول أن يوجه لهم أنا لا يمكن أن يتصور ما هي المشكلة، يمكنك إعطاء بعض الأمثلة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top