আপনি কীভাবে বিটম্যাপে দুটি পয়েন্টের মধ্যে একটি সরল রেখা আঁকবেন?


17

আমি উচ্চতার মানচিত্রগুলি (বিটম্যাপস) নিয়ে ঘুরে বেড়াচ্ছি, আমার গেমটিতে নিজের কিছু তৈরি করার চেষ্টা করছি এবং এর জন্য আমাকে কয়েকটি বেসিক অঙ্কন পদ্ধতি প্রয়োগ করতে হবে। আমি দ্রুত বুঝতে পেরেছি যে সরলরেখাগুলি আঁকার পক্ষে যতটা ভাবছিলাম ততটা বেসিক নয়।

আপনার পয়েন্টগুলি একটি এক্স বা ওয়াই সমন্বয় ভাগ করে নেওয়া যদি সহজ হয় বা সেগুলি যদি সংযুক্ত থাকে তবে আপনি নিখুঁতভাবে তির্যক রেখা আঁকতে পারেন। তবে অন্য সমস্ত ক্ষেত্রে এর কৌশলযুক্ত।

"সোজা" লাইন হওয়ার জন্য কোন পিক্সেলকে রঙিন করা প্রয়োজন তা নির্ধারণ করতে আপনি কোন অ্যালগরিদম ব্যবহার করেন?

উত্তর:


26

আমার মনে হয় আপনার যা দরকার তা হল ব্রেনহ্যামের লাইন অ্যালগরিদম

কি আমার মনে আছে তা নির্ধারণ করতে ব্যবহার করা হয় থেকে কি বিন্দু রঙ্গিন করা উচিত, না কত প্রতিটি বিন্দুতে রঙ্গিন করতে হবে।


21

একটি রেখাংশের উপযুক্ত ভিজ্যুয়াল সংলগ্নতা অর্জনের জন্য ব্রেসনহামের লাইন অ্যালগরিদমটি কোনও রাস্টার গ্রিডে কোন পয়েন্টগুলি প্লট করতে হবে তা নির্ধারণ করতে ব্যবহার করা যেতে পারে।

অ্যালগোরিদম একটি স্থানাঙ্ক স্থানে যেখানে উত্সটি উপরের বামে থাকে সেখানে উত্স এবং শেষ বিন্দু দ্বারা সংজ্ঞায়িত রেখার রাস্টারাইজেশনকে কভার করে। পূর্ণসংখ্যা স্থানাঙ্কগুলি পিক্সেল কেন্দ্রগুলিতে মানচিত্রের জন্য অনুমান করা হয়। উল্লেখযোগ্যভাবে, অ্যালগরিদমের মূল ফর্মটি কেবলমাত্র বৃত্তের একটি অক্টান্টকে coversেকে রাখে: এক যেখানে রেখার ক্রমবর্ধমান এক্স এবং ওয়াই সমন্বয় হয় তবে একটি নেতিবাচক opeাল যা পরম মানের সাথে 1 এর চেয়ে কম হয় অন্য সমস্ত অক্টেন্টগুলি এর সাধারণ রূপান্তর হিসাবে প্রাপ্ত হতে পারে বেসিক অক্ট্যান্ট

সাইয়েডোকোডে, এই প্রাথমিক ফর্মটি দেখতে দেখতে:

void DrawLine(Point origin, Point endpoint, Bitmap surface) {
    deltaX = endpoint.X - origin.X
    deltaY = endpoint.Y - origin.Y
    error = 0

    // Note the below fails for completely vertical lines.
    deltaError = absoluteValue(deltaY / deltaX)

    Y = origin.Y
    for (X from origin.X to endpoint.X) {
        surface.PlotPixel(X, Y)
        error = error + deltaError 
        if (error >= 0.5) {
            ++Y;
            error -= 1.0
        }
    }
}

রোসেটা কোড ওয়েবসাইটটিতে বিভিন্ন ভাষায় কংক্রিট বাস্তবায়ন সংকলন রয়েছে

আপনি উ এর লাইনের অ্যালগরিদম সম্পর্কেও আগ্রহী হতে পারেন যা অ্যান্টি-এলিয়জিংয়ের অনুমতি দেয়।


3
কেবল যাত্রীদের দ্বারা সতর্ক করতে চান যে অন্তর্ভুক্ত সিউডোকোডটিকে প্রসঙ্গের বাইরে না নেওয়ার কারণ এটি বাক্সটির বাইরে কাজ করবে না। এটি কেবলমাত্র একটি নির্দিষ্ট অক্ট্যান্টের জন্য কাজ করে (বাকি উত্তরটি পড়ুন)। আপনি যদি অনুলিপি / পেস্ট করার কোডটি সন্ধান করছেন তবে রোসটা কোড ওয়েবসাইটটির লিঙ্কটি চেষ্টা করুন।
কংগ্রেসবঙ্গাস

1
Wu এর লাইনের অ্যালগরিদমের সি সংস্করণটি যাচাই করতে চাইলে আমি আপনাকে সতর্ক করতে চাই যে এটি অসম্পূর্ণ। : _Dla_changebrightness যখন আপনি উজ্জ্বলতা আপনার কাছ থেকে এটি পরিবর্তন করতে প্রয়োজন পরিবর্তন to->red = br * (float)from->red;এই নিম্নলিখিত হবে: to->red = (br * (float)from->red) + ((1-br) * (float) to->red);। সম্মানজনকভাবে সবুজ এবং নীল রঙের জন্য একই করুন
ফ্রেড্রিক বোস্টন ওয়েস্টম্যান

2

এখানে লাইন আঁকার একটি অত্যন্ত সহজ উপায়। প্রকল্পগুলিতে সহজেই ফাংশনটি ব্যবহার করা যেতে পারে।

void draw_line(float x0, float y0, const float& x1, const float& y1)
{
    float x{x1 - x0}, y{y1 - y0};
    const float max{std::max(std::fabs(x), std::fabs(y))};
    x /= max; y /= max;
    for (float n{0}; n < max; ++n)
    {
        // draw pixel at ( x0, y0 )
        x0 += x; y0 += y;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.