سؤال

أحتاج إلى رسم مضلع من الجوانب "N" المعطاة 2 نقطتين (المركز و 1 من قمة رأسه) فقط أوتص في الرياضيات. لقد قرأت الكثير وكل هذا هو ما تمكنت من تحديده (لا أعرف ما إذا كان هذا صحيحًا):

حسنًا ، آخذ المسافة بين النقطتين (نصف القطر) مع نظرية فيثاغوراس:

sqrt(pow(abs(x - xc), 2) + pow(abs(y - yc), 2));

والزاوية بين هذه النقطتين مع ATAN2 ، مثل هذا:

atan2(abs(y - yc), abs(x - xc));

حيث XC ، YC هي نقطة الوسط و X ، y هي قمة الرأس الوحيدة.

وبهذه البيانات أفعل:

void polygon(int xc, int yc, int radius, double angle, int sides)
{
    int i;
    double ang = 360/sides; //Every vertex is about "ang" degrees from each other
    radian = 180/M_PI;
    int points_x[7]; //Here i store the calculated vertexs
    int points_y[7]; //Here i store the calculated vertexs

    /*Here i calculate the vertexs of the polygon*/
    for(i=0; i<sides; i++)
    {
        points_x[i] = xc + ceil(radius * cos(angle/radian));
        points_y[i] = yc + ceil(radius * sin(angle/radian));
        angle = angle+ang;
    }

    /*Here i draw the polygon with the know vertexs just calculated*/
    for(i=0; i<sides-1; i++)
        line(points_x[i], points_y[i], points_x[i+1], points_y[i+1]);
    line(points_y[i], points_x[i], points_x[0], points_y[0]);
}

المشكلة هي أن البرنامج لا يعمل بشكل صحيح لأنه يرسم الخطوط وليس مثل المضلع.

شخص ما كيف يعرف ما يكفي من الرياضيات لإعطاء يد؟ أنا أعمل في هذه الرسومات البدائية مع C و Turbo C.


تحرير: لا أريد ملء المضلع ، فقط ارسمه.

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

المحلول

النظر في ماذا 360/sides في الواقع يعود إذا sides ليس عاملاً من 360 (هذا هو تقسيم عدد صحيح - انظر ما الذي يعود 360/7 بالفعل).

ليست هناك حاجة لاستخدام درجات على الإطلاق - الاستخدام 2*Math_PI/(double)nsides والعمل في جميع أنحاء الراديان.

كما يمكنك حذف الخط النهائي باستخدام وظيفة المعامل (الوحدة النمطية nsides).

إذا كان لديك أكثر من 7 جوانب فلن تتمكن من تخزين جميع النقاط. لا تحتاج إلى تخزين جميع النقاط إذا كنت ببساطة ترسم المضلع بدلاً من تخزينها - النقطة الأخيرة فقط والنازحة الحالية.

نصائح أخرى

يجب أن تستخدم الراديان في جميع حساباتك. إليك برنامج كامل يوضح أفضل طريقة للقيام بذلك:

#include <stdio.h>

#define PI 3.141592653589

static void line (int x1, int y1, int x2, int y2) {
    printf ("Line from (%3d,%3d) - (%3d,%3d)\n", x1, y1, x2, y2);
}

static void polygon (int xc, int yc, int x, int y, int n) {
    int lastx, lasty;
    double r = sqrt ((x - xc) * (x - xc) + (y - yc) * (y - yc));
    double a = atan2 (y - yc, x - xc);
    int i;

    for (i = 1; i <= n; i++) {
        lastx = x; lasty = y;
        a = a + PI * 2 / n;
        x = round ((double)xc + (double)r * cos(a));
        y = round ((double)yc + (double)r * sin(a));
        line (lastx, lasty, x, y);
    }
}

int main(int argc, char* argv[]) {
    polygon (0,0,0,10,4);   // A diamond.
    polygon (0,0,10,10,4);  // A square.
    polygon (0,0,0,10,8);   // An octagon.
    return 0;
}

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

===
Line from (  0, 10) - (-10,  0)
Line from (-10,  0) - (  0,-10)
Line from (  0,-10) - ( 10,  0)
Line from ( 10,  0) - (  0, 10)
===
Line from ( 10, 10) - (-10, 10)
Line from (-10, 10) - (-10,-10)
Line from (-10,-10) - ( 10,-10)
Line from ( 10,-10) - ( 10, 10)
===
Line from (  0, 10) - ( -7,  7)
Line from ( -7,  7) - (-10,  0)
Line from (-10,  0) - ( -7, -7)
Line from ( -7, -7) - (  0,-10)
Line from (  0,-10) - (  7, -7)
Line from (  7, -7) - ( 10,  0)
Line from ( 10,  0) - (  7,  7)
Line from (  7,  7) - (  0, 10)

لقد كتبت polygon الوظيفة وفقًا لمواصفاتك الأصلية ، تمريرها فقط من الإحداثيين. جانبا ، أنت لا تفعل تريد هؤلاء abs مكالمات في حساباتك لنصف القطر والزاوية لأن:

  • إنهم عديم الجدوى لنصف القطر (منذ ذلك الحين -n2 = n2 للجميع n).
  • إنها سيئة للزاوية لأن ذلك سيجبرك على الربع المحدد (نقطة انطلاق خاطئة).

لن أعطيك الإجابة ، لكن لدي بعض النصائح. أولاً ، تعلم كيف يعمل رسم الخط من الداخل والخارج. عندما يكون لديك هذا ، حاول كتابة عارض مثلث مملوء. بشكل عام ، يتم رسم المضلعات المملوءة 1 خط مسح أفقي في وقت واحد ، من أعلى إلى أسفل. أنت مهمة هي تحديد الإحداثيات المبدئية لإيقاف X لكل خط مسح. لاحظ أن حافة المضلع تتبع خطًا مستقيمًا (تلميح ، تلميح) ... :)

أنت تحاول رسم بولي مليء على ما أعتقد؟

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

أفضل رهان لك هو العثور على بدائي يملأ لك قائمة الإحداثيات. الأمر متروك لك لتحديد الإحداثيات لإعطائها.

أعتقد أن المشكلة الرئيسية هي: atan2(abs(y - yc), abs(x - xc)); يمنحك الراديان ، وليس الدرجات ، فقط قم بتحويله إلى درجات وحاول.

/* all angles in radians */
double ainc = PI*2 / sides;
int x1, y1;
for (i = 0; i <= sides; i++){
    double a = angle + ainc * i;
    int x = xc + radius * cos(a);
    int y = yc + radius * sin(a);
    if (i > 0) line(x1, y1, x, y);
    x1 = x; y1 = y;
}

أو يمكنك حفظ النقاط في صفيف والاتصال بروتين DrawPoly إذا كان لديك واحدة.

إذا كنت تريد مضلعًا مملوءًا ، فاستدعاء FillPoly إذا كان لديك واحد.

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