اذهب إلى المحتوى

Recommended Posts

  • 1
نشر

تحياتي

المطلوب هو تعريف الmethods للصنف Line.

يمكن عمل المطلوب بوضع التالي في ملف Line.cpp :

#include <cmath>
#include "Line.h"

Line::Line(double x1, double y1, double x2, double y2)
{
    Line::x1 = x1;
    Line::x2 = x2;
    Line::y1 = y1;
    Line::y2 = y2;
}

double Line::getStartX()
{
    return x1;
}
double Line::getStartY()
{
    return y1;
}
double Line::getEndX()
{
    return x2;
}
double Line::getEndY()
{
    return y2;
}
double Line::getSlope()
{
    return (y2 - y1) / (x2 - x1);
}

bool Line::isVertical()
{
    return ((x2 - x1) == 0);
}

bool Line::isHorizontal()
{
    return ((y2 - y1) == 0);
}

bool Line::isThroughOrigin()
{
    return (x1 * (y2 - y1) == y1 * (x2 - x1));
}

void Line::mirror(int axis)
{
    double slope = getSlope();
    double new_slope = -slope;
    if (isVertical() && axis >= 0)
        y2 = y1 - (y2 - y1);

    else if (isHorizontal() && axis < 0)
        x2 = x1 - (x2 - x1);

    else
    {
        if (axis >= 0)
            y2 = y1 + new_slope * (x2 - x1);
        else
            x2 = x1 + ((y2 - y1) / new_slope);
    }
}

شرح الدوال:

بالنسبة للLine::Line هو الconstructor ويأخذ x1 و y1 وx2 وy2.

بالنسبة ل getStartX getStartY getEndX getEndY يقومو بإرجاع النقاط الأربعة x1 y1 x2 y2 بالترتيب.

بالنسبة لgetSlope تقوم بإرجاع ميل الخط المستقيم، ويتم حسابه من معادلة الميل:slope.png.a82165aeba61743ae26e8eeb4266d1a7.png

بالنسبة ل isVertical isHorizontal تقوم بالتحقق إذا كان الخط أفقي أو رأسي.

ويتم التحقق من ذلك من خلال الكشف إذا كان x2 -x1 مساوي للصفر في حالة الكشف عن إذا كان الخط رأسي، وإذا كان y2 - y1 مساوي للصفر في حالة إذا كان الخط أفقي.

بالنسبة ل isThroughOrigin تقوم بالتحقق إذا كان الخط يمر بنقطة الأصل (0،0)، ويتم ذلك عن طريق التحقق إذا كان (x1 * (y2 - y1) == y1 * (x2 - x1)) .

 

بالنسبة ل mirror تأخذ متغير axis وتقوم بعمل إنعكاس للخط حول المحور الأفقي إذا كانت axis أكبر من أو تساوي للصفر، أو المحور الرأسي إذا كانت axis أقل من الصفر.

وحسب المطلوب فإن الإنعكاس لا يغير نقطة البداية x1 y1 ولكن يغير نقطة النهاية فقط، مع ملاحظة أن إذا كان الإنعكاس حول المحور الأفقي فإن x1 y1 x2 لا يتغيروا، ويتغير فقط y2.

وبالمثل إذا كان الإنعكاس حول المحور الرأسي فإن x1 y1 y2 لا يتغيروا، ويتغير فقط x2.

ولاحظ أيضاً أنه عند عمل الإنعكاس، فإن الميل للخط المستقيم يتغير للسالب، مثلاً إذا كان ميل الخط 5 يصبح -5 وهكذا.

وبالتالي يمكن معرفة النقطة الناقصة بالتعويض في معادلة الميل مع إضافة إشارة سالبة للميلslope_new.png.de917780abcdea904cc39068512d71a6.png

وبالمثل لحساب x2.

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

y2 = y1 - (y2 - y1);

في حالة الخط الرأسي.

و باستخدام:

 x2 = x1 - (x2 - x1);

في حالة الخط الافقي.

بالتوفيق.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...