ঘড়ির কাঁটার ক্রমে পয়েন্টগুলি সাজান?


156

এক্স, ওয়াই পয়েন্টের একটি অ্যারে দেওয়া, আমি কীভাবে এই অ্যারের বিন্দুগুলি ঘড়ির কাঁটার ক্রম (তাদের সামগ্রিক গড় কেন্দ্রের পয়েন্টের চারপাশে) বাছাই করব? আমার লক্ষ্যটি পয়েন্টগুলি একটি লাইন-ক্রিয়া ফাংশনটিতে পৌঁছানোর পরিবর্তে "দৃ "়" দেখায়, কোনও লাইনকে ছেদ না করে যতটা সম্ভব উত্তল হিসাবে দেখা উচিত with

এটির মূল্যের জন্য, আমি লুয়া ব্যবহার করছি তবে যে কোনও সিডোকোড প্রশংসা করবে।

আপডেট: রেফারেন্সের জন্য, এটি কিউমজের দুর্দান্ত উত্তরের ভিত্তিতে লুয়া কোড (আমার "অ্যাপ" উপসর্গটিকে উপেক্ষা করুন):

function appSortPointsClockwise(points)
    local centerPoint = appGetCenterPointOfPoints(points)
    app.pointsCenterPoint = centerPoint
    table.sort(points, appGetIsLess)
    return points
end

function appGetIsLess(a, b)
    local center = app.pointsCenterPoint

    if a.x >= 0 and b.x < 0 then return true
    elseif a.x == 0 and b.x == 0 then return a.y > b.y
    end

    local det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y)
    if det < 0 then return true
    elseif det > 0 then return false
    end

    local d1 = (a.x - center.x) * (a.x - center.x) + (a.y - center.y) * (a.y - center.y)
    local d2 = (b.x - center.x) * (b.x - center.x) + (b.y - center.y) * (b.y - center.y)
    return d1 > d2
end

function appGetCenterPointOfPoints(points)
    local pointsSum = {x = 0, y = 0}
    for i = 1, #points do pointsSum.x = pointsSum.x + points[i].x; pointsSum.y = pointsSum.y + points[i].y end
    return {x = pointsSum.x / #points, y = pointsSum.y / #points}
end


1
সেই বিন্দু দিয়ে রেডিয়াল লাইনের কোণটি গণনা করার বিষয়ে ভাবুন। তারপরে কোণ অনুসারে বাছাই করুন।
রাষ্ট্রপতি জেমস কে পোলক

কেস আপনি জানেন না যে, Lua একটি builtin ফাংশন আছে ipairs(tbl)যে সূচকের উপর iterates এবং মান 1 থেকে tbl এর #tbl করতে। সুতরাং সমষ্টি গণনার জন্য, আপনি এটি করতে পারেন, যা বেশিরভাগ লোককে আরও পরিষ্কার দেখায়:for _, p in ipairs(points) do pointsSum.x = pointsSum.x + p.x; pointsSum.y = pointsSum.y + p.y end
পোনকডুডল

2
@ ওয়াল্লাকোলু এটি অত্যন্ত বিতর্কিত। এছাড়াও, ভ্যানিলাতে লুয়া ipairsলুপের জন্য সংখ্যাগুলির তুলনায় উল্লেখযোগ্যভাবে ধীর।
আলেকজান্ডার গ্ল্যাডিশ

এটি আমার ক্ষেত্রে কাজ করার জন্য আমাকে কিছু ছোট পরিবর্তন করতে হয়েছিল (কেবলমাত্র একটি কেন্দ্রের সাথে তুলনামূলকভাবে দুটি পয়েন্টের তুলনা করা)। কোডটিতে এই সমস্ত 0 টির সাথে তুলনাটি মনে হয় যে বিন্দুগুলি একটি স্বেচ্ছাচারী বিন্দুর বিপরীতে উত্সের চারপাশে বিতরণ করা হয়েছে। আমি আরও মনে করি যে প্রথম শর্তটি কেন্দ্রের পয়েন্টের নীচে পয়েন্টগুলি ভুলভাবে বাছাই করবে। কোডটির জন্য ধন্যবাদ যদিও এটি সত্যিই সহায়ক হয়েছে!
ব্যক্তিগতনাডির

উত্তর:


192

প্রথমে কেন্দ্র বিন্দুটি গণনা করুন। তারপরে আপনার পছন্দ অনুসারে বাছাই করা অ্যালগরিদম ব্যবহার করে পয়েন্টগুলি সাজান, তবে একটি পয়েন্ট অপরের চেয়ে কম কিনা তা নির্ধারণের জন্য বিশেষ তুলনার রুটিন ব্যবহার করুন।

এই সাধারণ গণনার মাধ্যমে কেন্দ্রের সাথে সম্পর্কিত হয়ে একটি পয়েন্ট (ক) বাম দিকে বা অন্যের (ড) এর ডানদিকে রয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন:

det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y)

যদি ফলাফলটি শূন্য হয়, তবে তারা কেন্দ্র থেকে একই লাইনে থাকবে, যদি এটি ইতিবাচক বা নেতিবাচক হয় তবে তা একদিকে বা অন্যদিকে থাকে, সুতরাং একটি পয়েন্ট অন্যটির আগে চলে যাবে। এটি ব্যবহার করে আপনি পয়েন্টগুলি তুলনা করতে এবং সজ্জিত অ্যারেতে যে ক্রমটি প্রদর্শিত হবে তা নির্ধারণের জন্য একটি তুলনামূলক কম সম্পর্ক তৈরি করতে পারেন। তবে আপনাকে নির্ধারণ করতে হবে যে ক্রমটির শুরু কোথায়, আমি বোঝাতে চাই কোন কোণটি প্রারম্ভিকটি হবে (যেমন এক্স অক্ষের ধনাত্মক অর্ধেক))

তুলনা ফাংশনের কোডটি এর মতো দেখতে পারে:

bool less(point a, point b)
{
    if (a.x - center.x >= 0 && b.x - center.x < 0)
        return true;
    if (a.x - center.x < 0 && b.x - center.x >= 0)
        return false;
    if (a.x - center.x == 0 && b.x - center.x == 0) {
        if (a.y - center.y >= 0 || b.y - center.y >= 0)
            return a.y > b.y;
        return b.y > a.y;
    }

    // compute the cross product of vectors (center -> a) x (center -> b)
    int det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y);
    if (det < 0)
        return true;
    if (det > 0)
        return false;

    // points a and b are on the same line from the center
    // check which point is closer to the center
    int d1 = (a.x - center.x) * (a.x - center.x) + (a.y - center.y) * (a.y - center.y);
    int d2 = (b.x - center.x) * (b.x - center.x) + (b.y - center.y) * (b.y - center.y);
    return d1 > d2;
}

এটি 12 মিনিট থেকে শুরু হয়ে পয়েন্টগুলি অর্ডার করবে। একই "ঘন্টা" এর পয়েন্টগুলি কেন্দ্র থেকে আরও যেগুলি রয়েছে তার থেকে শুরু করার আদেশ দেওয়া হবে।

যদি পূর্ণসংখ্যার প্রকারগুলি (যা লুয়ায় প্রকৃতপক্ষে উপস্থিত না হয়) ব্যবহার করে তবে আপনাকে নিশ্চিত করতে হবে যে ডিটি, ডি 1 এবং ডি 2 ভেরিয়েবলগুলি এমন এক ধরণের যা সম্পাদিত গণনার ফলাফলটি ধরে রাখতে সক্ষম হবে।

যদি আপনি কিছুটা দৃ looking়, যতটা সম্ভব উত্তল হিসাবে সন্ধান করতে চান, তবে আমি অনুমান করি আপনি একটি উত্তল হাল খুঁজছেন । আপনি গ্রাহাম স্ক্যান ব্যবহার করে এটি গণনা করতে পারেন । এই অ্যালগরিদমে আপনাকে একটি বিশেষ পিভট পয়েন্ট থেকে শুরু করে পয়েন্টগুলি ক্লকওয়াইজ (বা ঘড়ির কাঁটার দিকের দিকের) থেকে বাছাই করতে হবে। তারপরে আপনি সরল লুপ পদক্ষেপগুলি প্রতিবার পুনরায় পুনরুদ্ধার করেন যে আপনি উত্তল হালতে নতুন পয়েন্ট যুক্ত করে বাম বা ডানে ঘুরছেন কিনা, এই চেকটি উপরের তুলনা ফাংশনের মতো ক্রস প্রোডাক্টের উপর ভিত্তি করে।

সম্পাদনা:

if (a.y - center.y >= 0 || b.y - center.y >=0)কেন্দ্র থেকে আরও এগিয়ে থাকা পয়েন্টগুলি থেকে শুরু করে x = 0 এবং negativeণাত্মক y রয়েছে এমন পয়েন্টগুলি বাছাই করা হয়েছে তা নিশ্চিত করার জন্য বিবৃতিতে আরও একটি যুক্ত করা হয়েছে। আপনি যদি একই 'ঘন্টা' তে পয়েন্টের ক্রমটির বিষয়ে চিন্তা না করেন তবে আপনি যদি বিবৃতিটি বাদ দিতে পারেন এবং সর্বদা ফিরে আসতে পারেন a.y > b.y

সংশোধন করে প্রথম যুক্ত করা থাকলে -center.xএবং -center.y

বিবৃতি দ্বিতীয় যোগ (a.x - center.x < 0 && b.x - center.x >= 0)। এটি একটি স্পষ্ট তদারকি ছিল যে এটি অনুপস্থিত ছিল। বিবৃতিগুলি এখনই পুনর্বিন্যাস করা যেতে পারে কারণ কিছু চেক অপ্রয়োজনীয়। উদাহরণস্বরূপ, যদি প্রথম শর্তে বিবৃতিটি মিথ্যা হয় তবে দ্বিতীয়টির প্রথম শর্তটি অবশ্যই সত্য হতে হবে। আমি সিদ্ধান্ত নিয়েছি, কোডটি সরলতার জন্য যেমন হয় তেমন ছেড়ে দেওয়া। এটি বেশ সম্ভব যে সংকলক কোডটি অনুকূলিত করবে এবং যাইহোক একই ফলাফল উত্পন্ন করবে।


25
+1: না atan(), কোনও বর্গমূল নয়, এমনকি কোনও বিভাজনও নেই। এটি কম্পিউটার গ্রাফিক্স চিন্তাভাবনার একটি ভাল উদাহরণ। যত তাড়াতাড়ি সম্ভব সমস্ত সহজ কেস কেটে ফেলুন, এবং এমনকি শক্ত অবস্থাতেও প্রয়োজনীয় উত্তরটি জানার জন্য যত কম সম্ভব গণনা করুন।
আরবেরটিগ

তবে এর জন্য সমস্ত পয়েন্টকে অন্য সকলের সাথে তুলনা করা দরকার। নতুন পয়েন্টগুলি সন্নিবেশ করার কোনও সহজ পদ্ধতি আছে?
Iterator

2
যদি পয়েন্টগুলির সেটটি প্রাইরি হিসাবে পরিচিত হয় তবে এটি কেবল ও (এন * লগ এন) তুলনা করে। আপনি যদি ইতিমধ্যে পয়েন্টগুলি যুক্ত করতে চান তবে আপনার সেগুলি একটি সুষম সেটগুলিতে রাখা দরকার যেমন একটি ভারসাম্য বাইনারি অনুসন্ধান গাছ। এই জাতীয় ক্ষেত্রে একটি নতুন পয়েন্ট যুক্ত করতে ও (লগ এন) তুলনা প্রয়োজন এবং এটি পোলার স্থানাঙ্কের সাথে জড়িত সমাধানের জন্য ঠিক একই।
কিয়ামজ

2
এটি কি কেসটি অনুপস্থিত: যদি (ax - Center.x <0 && bx - Center.x> = 0) মিথ্যা ফেরত দেয়;
টম মার্টিন

2
এই যে. এটি বেশ পুরানো, তবে: "এটি 12 টা থেকে শুরু হবে পয়েন্টগুলি ক্লকওয়াইডের অর্ডার করবে" " কেন 12 টা বাজে এবং আমি কীভাবে এটি 6 এ পরিবর্তন করতে পারি? আমাকে কেউ বলতে পারবে?
ইসমোহ

20

আপনার সমস্যার একটি আকর্ষণীয় বিকল্প পন্থা হ'ল ট্র্যাভেলিং বিক্রয় বিক্রয় সমস্যা (টিএসপি) এর আনুমানিক ন্যূনতম সন্ধান করা, অর্থাৎ। আপনার সমস্ত পয়েন্টকে সংযুক্ত করে সংক্ষিপ্ততম রুট। যদি আপনার পয়েন্টগুলি উত্তল আকৃতি গঠন করে, তবে এটি সঠিক সমাধান হওয়া উচিত, অন্যথায়, এটি এখনও ভাল দেখানো উচিত (একটি "শক্ত" আকৃতিটি এমন একটি হিসাবে নির্ধারিত করা যেতে পারে যা কম পরিধি / ক্ষেত্রের অনুপাত রয়েছে, যা আমরা এখানে অনুকূলিত করছি) ।

আপনি টিএসপি-র জন্য একটি অপ্টিমাইজারের যে কোনও বাস্তবায়ন ব্যবহার করতে পারেন, যার মধ্যে আমি যথেষ্ট নিশ্চিত যে আপনি নিজের পছন্দের ভাষায় একটি টন খুঁজে পেতে পারেন।


বাবা। "আকর্ষণীয়" একটি স্বল্পমূল্য unders :)
Iterator

@ ইটারেটর: আমি আমার ধারণাটি নিয়ে বেশ খুশি হয়েছিলাম, এর জন্য নিম্নমান বোধ করতে পেরে আমি বেশ হতাশ: - / আপনি কি এটি বৈধ বলে মনে করেন?
স্থিতিশীল_আর্টি

1
আমি অবশ্যই এনপি-সম্পূর্ণ আসল অ্যালগরিদম নয়, অনেকগুলি দ্রুত প্রায় অনুমানের একটি ব্যবহার করার পরামর্শ দিচ্ছিলাম।
স্থিতিশীল_আর্টি

6
আমি অতিরিক্ত কোণ প্রশংসা করি! বেশ কয়েকটি বৈধ, খুব আলাদা উত্তর থাকলে, ভবিষ্যতে কেউ যদি এই থ্রেডটিতে মস্তিষ্কের ঝুঁকির বিকল্পগুলির দিকে ঝুঁকতে পড়েন তবে তা বেশ কার্যকর হতে পারে।
ফিলিপ লেন্সেন

1
নোট করুন যে আমার পদ্ধতির সম্ভবত ধীর, তবে জটিল ক্ষেত্রে আরও সঠিক: উদাহরণস্বরূপ, একটি "8" এর জন্য পয়েন্টের ক্ষেত্রে কল্পনা করুন। পোলার স্থানাঙ্কগুলি সে ক্ষেত্রে আপনাকে সাহায্য করবে না এবং আপনি যে ফলাফলটি পাবেন তা আপনার পছন্দকৃত কেন্দ্রের উপর নির্ভর করবে। টিএসপি সমাধানটি কোনও "হিউরিস্টিক" পরামিতিগুলির থেকে স্বতন্ত্র।
স্থিতিশীল_আর্টি

19

আপনি যা চাইছেন তা হ'ল একটি মেরু স্থানাঙ্ক হিসাবে পরিচিত একটি সিস্টেম । কার্টেসিয়ান থেকে পোলার স্থানাঙ্কে রূপান্তর সহজেই কোনও ভাষায় করা যায়। সূত্রগুলি এই বিভাগে পাওয়া যাবে ।

পোলার স্থানাঙ্কে রূপান্তরিত করার পরে, কেবল কোণ দ্বারা বাছাই করুন, থিটা।


4
এটি কাজ করবে তবে অর্ডিং প্রশ্নের উত্তর দেওয়ার জন্য এটির চেয়ে আরও বেশি গণনা করার ত্রুটি থাকবে। অনুশীলনে, আপনি প্রকৃত কোণ বা রেডিয়াল দূরত্বগুলি সম্পর্কে কেবল যত্নশীল হন না, কেবল তাদের আপেক্ষিক ক্রম। সিমাজের দ্রবণ আরও ভাল কারণ এটি বিভাগ, বর্গমূল এবং ট্রিগ এড়ানো হয়।
আরবার্টেইগ

1
"আরও ভাল" এর জন্য আপনার মানদণ্ড কী তা আমি নিশ্চিত নই। উদাহরণস্বরূপ, সমস্ত পয়েন্টকে একে অপরের সাথে তুলনা করা একরকম গণনার অপচয়। ট্রিগ এমন কিছু নয় যা বড়দের ভয় পায়, তাই না?
Iterator

3
এটি ট্রিগ ভীতিজনক নয়। সমস্যাটি হ'ল ট্রিগটি গণনা করা ব্যয়বহুল, এবং কোণগুলির আপেক্ষিক ক্রম নির্ধারণের প্রয়োজন হয়নি। একইভাবে, রেডিয়িকে যথাযথভাবে সাজানোর জন্য আপনাকে বর্গাকার শিকড়গুলি নিতে হবে না। কার্টেসিয়ান থেকে পোলার স্থানাঙ্কে পুরো রূপান্তরটি একটি আর্ক-ট্যানজেন্ট এবং বর্গমূল উভয়ই করবে। সুতরাং আপনার উত্তরটি সঠিক, তবে কম্পিউটার গ্রাফিক্স বা গণিত জ্যামিতির প্রসঙ্গে এটি করার সর্বোত্তম উপায় না হওয়ার সম্ভাবনা রয়েছে।
আরবের্টেইগ

বুঝেছি. তবে ওপি কম-জিও হিসাবে পোস্ট করেনি, এটি অন্য কারও দ্বারা ট্যাগ। তবুও, দেখে মনে হচ্ছে যে অন্যান্য সমাধানগুলি পয়েন্টের # তে বহুপদী, বা আমি ভুল করছি? যদি তা হয় তবে এটি ট্রিগের চেয়ে বেশি চক্র পোড়াবে।
ইটরেটর

আমি আসলে কমপ-জিও ট্যাগটি লক্ষ্য করি নি, আমি কেবল ধরে নিয়েছি যে প্রশ্নের কেবল যুক্তিযুক্ত অ্যাপ্লিকেশনগুলি একটি বা অন্যটি হতে হবে। সর্বোপরি, কেবলমাত্র কয়েকটি পয়েন্ট থাকলে এবং / অথবা অপারেশন খুব কমই সম্পন্ন হবে যদি পারফরম্যান্স প্রশ্নটি মুট হয়ে যায়। এই মুহুর্তে, কীভাবে এটি কীভাবে করা যায় তা জেনে রাখা গুরুত্বপূর্ণ হয়ে যায় এবং সে কারণেই আমি আপনার উত্তরটি সঠিক is এটি ব্যাখ্যা করে যে কীভাবে "ক্লকওয়াইজ অর্ডার" ধারণাটি গণনা করতে হবে যে সম্পর্কে কারও কাছে ব্যাখ্যা করা যেতে পারে।
আরবেরটিগ

3

আর একটি সংস্করণ (যদি বি এর আগে ঘড়ির কাঁটার দিকে আসে তবে সত্য ফিরে আসুন):

    bool lessCcw(const Vector2D &center, const Vector2D &a, const Vector2D &b) const
    {
        // Computes the quadrant for a and b (0-3):
        //     ^
        //   1 | 0
        //  ---+-->
        //   2 | 3

        const int dax = ((a.x() - center.x()) > 0) ? 1 : 0;
        const int day = ((a.y() - center.y()) > 0) ? 1 : 0;
        const int qa = (1 - dax) + (1 - day) + ((dax & (1 - day)) << 1);

        /* The previous computes the following:

           const int qa =
           (  (a.x() > center.x())
            ? ((a.y() > center.y())
                ? 0 : 3)
            : ((a.y() > center.y())
                ? 1 : 2)); */

        const int dbx = ((b.x() - center.x()) > 0) ? 1 : 0;
        const int dby = ((b.y() - center.y()) > 0) ? 1 : 0;
        const int qb = (1 - dbx) + (1 - dby) + ((dbx & (1 - dby)) << 1);

        if (qa == qb) {
            return (b.x() - center.x()) * (a.y() - center.y()) < (b.y() - center.y()) * (a.x() - center.x());
        } else {
            return qa < qb;
       } 
    }

এটি আরও দ্রুত, কারণ সংকলক (ভিজ্যুয়াল সি ++ 2015 এ পরীক্ষা করা) ডেক্স, ডে, ডিবিএক্স, ডিবি গুনতে লাফ তৈরি করে না। এখানে সংকলক থেকে আউটপুট সমাবেশ:

; 28   :    const int dax = ((a.x() - center.x()) > 0) ? 1 : 0;

    vmovss  xmm2, DWORD PTR [ecx]
    vmovss  xmm0, DWORD PTR [edx]

; 29   :    const int day = ((a.y() - center.y()) > 0) ? 1 : 0;

    vmovss  xmm1, DWORD PTR [ecx+4]
    vsubss  xmm4, xmm0, xmm2
    vmovss  xmm0, DWORD PTR [edx+4]
    push    ebx
    xor ebx, ebx
    vxorps  xmm3, xmm3, xmm3
    vcomiss xmm4, xmm3
    vsubss  xmm5, xmm0, xmm1
    seta    bl
    xor ecx, ecx
    vcomiss xmm5, xmm3
    push    esi
    seta    cl

; 30   :    const int qa = (1 - dax) + (1 - day) + ((dax & (1 - day)) << 1);

    mov esi, 2
    push    edi
    mov edi, esi

; 31   : 
; 32   :    /* The previous computes the following:
; 33   : 
; 34   :    const int qa =
; 35   :        (   (a.x() > center.x())
; 36   :         ? ((a.y() > center.y()) ? 0 : 3)
; 37   :         : ((a.y() > center.y()) ? 1 : 2));
; 38   :    */
; 39   : 
; 40   :    const int dbx = ((b.x() - center.x()) > 0) ? 1 : 0;

    xor edx, edx
    lea eax, DWORD PTR [ecx+ecx]
    sub edi, eax
    lea eax, DWORD PTR [ebx+ebx]
    and edi, eax
    mov eax, DWORD PTR _b$[esp+8]
    sub edi, ecx
    sub edi, ebx
    add edi, esi
    vmovss  xmm0, DWORD PTR [eax]
    vsubss  xmm2, xmm0, xmm2

; 41   :    const int dby = ((b.y() - center.y()) > 0) ? 1 : 0;

    vmovss  xmm0, DWORD PTR [eax+4]
    vcomiss xmm2, xmm3
    vsubss  xmm0, xmm0, xmm1
    seta    dl
    xor ecx, ecx
    vcomiss xmm0, xmm3
    seta    cl

; 42   :    const int qb = (1 - dbx) + (1 - dby) + ((dbx & (1 - dby)) << 1);

    lea eax, DWORD PTR [ecx+ecx]
    sub esi, eax
    lea eax, DWORD PTR [edx+edx]
    and esi, eax
    sub esi, ecx
    sub esi, edx
    add esi, 2

; 43   : 
; 44   :    if (qa == qb) {

    cmp edi, esi
    jne SHORT $LN37@lessCcw

; 45   :        return (b.x() - center.x()) * (a.y() - center.y()) < (b.y() - center.y()) * (a.x() - center.x());

    vmulss  xmm1, xmm2, xmm5
    vmulss  xmm0, xmm0, xmm4
    xor eax, eax
    pop edi
    vcomiss xmm0, xmm1
    pop esi
    seta    al
    pop ebx

; 46   :    } else {
; 47   :        return qa < qb;
; 48   :    }
; 49   : }

    ret 0
$LN37@lessCcw:
    pop edi
    pop esi
    setl    al
    pop ebx
    ret 0
?lessCcw@@YA_NABVVector2D@@00@Z ENDP            ; lessCcw

উপভোগ করুন।


1
স্যুইচটিতে দুটি রিটার্নের বিবৃতি গণিতের সমতুল্য। স্যুইচ থাকার কোনও কারণ আছে?
unagi

0
  • vector3 a = new vector3 (1, 0, 0) .............. আর্ট এক্স_এক্সিস
  • vector3 b = any_Point - কেন্দ্র;
- y = |a * b|   ,   x =  a . b

- Atan2(y , x)...............................gives angle between -PI  to  + PI  in radians
- (Input % 360  +  360) % 360................to convert it from  0 to 2PI in radians
- sort by adding_points to list_of_polygon_verts by angle  we got 0  to 360

অবশেষে আপনি অ্যান্টিকলোকাইজ সাজানো ভার্টস পাবেন

list.Reverse () .................. Clockwise_order

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.