বেজিয়ার বক্রাকার চাপের দৈর্ঘ্য


23

আরও দেখুন: ম্যাথ.এসই তে একই প্রশ্ন

আমি কীভাবে বেজিয়ার বক্ররেখাটির স্নোহকতা পেতে পারি? উদাহরণস্বরূপ, একটি লিনিয়ার বেজিয়ার বক্ররেখা দৈর্ঘ্য:

length = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));

তবে চতুর্ভুজ, কিউবিক বা এন-ডিগ্রি বেজিয়ার কার্ভগুলির কী হবে?

(আমার লক্ষ্যটি আগে একটি নমুনা রেজোলিউশনের অনুমান করা ছিল, সুতরাং পরবর্তী পয়েন্টটি পূর্ববর্তী পয়েন্টটি স্পর্শ করছে কিনা তা পরীক্ষা করার জন্য আমাকে সময় নষ্ট করতে হবে না।)


1
আপনার বক্ররেখার দৈর্ঘ্যের বিষয়ে উল্লেখ করতে প্রশ্নটির পুনঃব্যবহার করা উচিত, এটি অনেক বেশি সরল (এবং অনুসন্ধানযোগ্য) শব্দ।
স্পার

আমি এটি গণিতে পোস্ট করার পরামর্শ দিচ্ছি, আমি নিশ্চিত যে সেখানে কিছু চতুর মুখ আপনাকে উত্তর দেবে তাদের মধ্যে একটি চতুর ওয়েব ফন্ট: পি
টোর ভ্যালামো

2
@ টোর আমি (গতকাল) করেছি, তবে আমাকে বলা হয়েছে এটি খুব জটিল এবং অতএব অনুশীলনীয়। [ math.stackexchange.com/q/12186/2736 ]
মতেন উলহাক

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

উত্তর:


9

কিউবিক বেজিয়ার্সের একটি সহজ উপায় হ'ল বক্ররেখাকে এন বিভাগে বিভক্ত করা এবং বিভাগগুলির দৈর্ঘ্য যোগ করা sum

তবে, আপনার বক্ররেখার কেবলমাত্র অংশের দৈর্ঘ্যের প্রয়োজন হবে (যেমন দৈর্ঘ্যের 30% পয়েন্ট অবধি), চাপ-দৈর্ঘ্যের পরামিতিটি কার্যকর হবে। আমি সহজ নমুনা কোড সহ, বাজিয়ার্স সম্পর্কে আমার নিজের একটি প্রশ্নে মোটামুটি দীর্ঘ উত্তর পোস্ট করেছি ।


আমি এটি LEGO Mindstorms NXT এর জন্য করছি, যার সত্যিকারের দুর্বল প্রসেসর (48Mhz) রয়েছে, তাই আমার যতটা সম্ভব গতি দরকার। আমি কিছু গতি সংরক্ষণের জন্য বিভাজক পদ্ধতি গ্রহণ করব এবং এটি যথাযথভাবে পেয়ে যাব ("অ-রিয়েলটাইম" রেন্ডারিংয়ের জন্য)। আমার কাছে একটি বিকল্প রয়েছে যাতে আপনি 1.0/t(ডাকা resolution) এর মান সেট করতে পারেন , সুতরাং এটি "রিয়েলটাইম" এর জন্য (যা ধীর NXT এর সেরা 10fps এ)। প্রতিটি পুনরাবৃত্তি, t += resolutionএবং একটি নতুন পয়েন্ট / লাইন আঁকা হয়। যাইহোক, ধারণার জন্য ধন্যবাদ।
মতিন উলহাক

4

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

প্রকৃতপক্ষে, আমি বিশ্বাস করি যখন গ্রাফিক্স সাবসিস্টেমটিকে বেজিয়ার বক্ররেখা আঁকতে হয় তখন এটি সাধারণত গ্রহণ করা হয়। তবে এ সম্পর্কে আমাকে উদ্ধৃত করবেন না, এই মুহুর্তে আমার কাছে রেফারেন্স নেই।

অনুশীলনে এটি দেখতে এইরকম হবে: (ভাষাটি অপ্রাসঙ্গিক বাদে)

public static Line[] toLineStrip(BezierCurve bezierCurve, double epsilon) {
    ArrayList<Line> lines = new ArrayList<Line>();

    Stack<BezierCurve> parts = new Stack<BezierCurve>();
    parts.push(bezierCurve);

    while (!parts.isEmpty()) {
        BezierCurve curve = parts.pop();
        if (distanceToBaseline(curve) < epsilon) {
            lines.add(new Line(curve.get(0), curve.get(1)));
        } else {
            parts.addAll(curve.split(0.5));
        }
    }

    return lines.toArray(new Line[0]);
}

যদিও এটি একটি ভাল পদ্ধতির, আমি উচ্চ-অর্ডার বেজিয়ার কার্ভগুলিতে সংখ্যার অস্থিরতার কথা শুনেছি, যার আরও একটি ধারণা প্রয়োজন: উচ্চ-অর্ডার বক্ররেখাগুলি ছোট ছোট ঘনকীয় বক্ররেখায় বিভক্ত করা।
মতিন উলহাক

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

2

বেজিয়ার কার্ভগুলির জন্য খিলান দৈর্ঘ্য কেবল রৈখিক এবং চতুষ্কোণের জন্য বন্ধ ফর্ম। কিউবিকগুলির জন্য, এটি বন্ধ সমাধান থাকার গ্যারান্টিযুক্ত নয়। কারণটি হল আর্কের দৈর্ঘ্য একটি র‌্যাডিকাল অবিচ্ছেদ্য দ্বারা সংজ্ঞায়িত করা হয়, যার জন্য কেবল ২ য় ডিগ্রি বহুবর্ষের জন্য বন্ধ রয়েছে।

কেবলমাত্র রেফারেন্সের জন্য: বিন্দু (ক, পি) (বি, কিউ) এবং (সি, আর) এর জন্য একটি চতুর্ভুজ বেজিয়ারের দৈর্ঘ্য হ'ল

(a ^ 2 · (q ^ 2 - 2 · q · r + r ^ 2) + 2 · a · (আর - কিউ) · (বি · (পি - আর) + সি · (কিউ - পি)) + ( বি · (পি - আর) + সি · (কিউ - পি)) ^ 2) · এলএন ((√ (a ^ 2 - 2 · a · বি + বি ^ 2 + পি ^ 2 - 2 · পি · কিউ + কিউ) ^ 2) · √ (a ^ 2 + 2 · a · (সি - 2 · বি) + 4 · বি ^ 2 - 4 · বি · সি + সি ^ 2 + (পি - 2 · কিউ + আর) ^ 2) + a ^ 2 + a · (সি - 3 · বি) + 2 · বি ^ 2 - বি · সি + (পি - কিউ) · (পি - 2 · কিউ + আর)) / (√ (এ ^ 2 + 2 · A · (সি - 2 · বি) + 4 · বি ^ 2 - 4 · বি · সি + সি ^ 2 + (পি - 2 · কিউ + আর) ^ 2) · √ (বি ^ 2 - 2 · বি · সি + সি ^ 2 + কিউ ^ 2 - 2 · কিউ · আর + আর ^ 2) + এ · (বি - সি) - 2 · বি ^ 2 + 3 · বি · সি - সি ^ 2 + (পি - 2 কিউ + আর) · (কিউ - আর)) / / (এ + 2 + 2 · এ · (সি - 2 · বি) + 4 · বি ^ 2 - 4 · বি · সি + সি ^ 2 + (পি - 2) · কিউ + আর) ^ 2) ^ (3/2) + (√ (a ^ 2 - 2 · a · বি + বি ^ 2 + পি ^ 2 - 2 · পি · কিউ + কিউ ^ 2) · (এ ^ 2 + এ · (সি - 3 · বি) + 2 · বি ^ 2 - বি · সি + (পি - কিউ) · (পি - 2 · কিউ + আর)) - √ (বি ^ 2 - 2 · বি · সি + সি ^ 2 + কিউ ^ 2 - 2 · কিউ · আর + আর ^ 2) · (এ · (বি - সি) - 2 · বি ^ 2 + 3 · বি · সি - সি ^ 2 + (পি - 2 কিউ + আর) · (কিউ - আর)) / / (এ + 2 + 2 · এ · (সি - 2 · বি) + 4 · বি ^ 2 - 4 · বি · সি + সি ^ 2 + (পি - 2) · কিউ + আর) ^ 2)

যেখানে এলএন হ'ল প্রাকৃতিক লোগারিদম এবং power শক্তি এবং √ বর্গমূলকে বোঝায়।

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


2

আমি 3 পয়েন্ট বেজিয়ারের (নীচে) দৈর্ঘ্যের বদ্ধ ফর্ম এক্সপ্রেশনটি কাজ করেছি। আমি 4+ পয়েন্টের জন্য একটি বদ্ধ ফর্মটি কাজ করার চেষ্টা করি নি। এটি সম্ভবত প্রতিনিধিত্ব করা এবং পরিচালনা করা কঠিন বা জটিল হতে পারে। তবে, রঞ্জ-কত্তা সংহতকরণ অ্যালগরিদমের মতো একটি সংখ্যাসূচক আনুমানিক প্রযুক্তিটি অর্কের দৈর্ঘ্যের সূত্রটি ব্যবহার করে একীভূত করে বেশ ভালভাবে কাজ করবে । এমএসইতে আরকে 45- এ আমার প্রশ্নোত্তর আর কে 45 বাস্তবায়নে সহায়তা করতে পারে।

এখানে একটি 3 পয়েন্ট বেজিয়ে এর চাপ দৈর্ঘ্য জন্য কিছু জাভা কোড, পয়েন্ট সাথে আছেন a, bআর c

    v.x = 2*(b.x - a.x);
    v.y = 2*(b.y - a.y);
    w.x = c.x - 2*b.x + a.x;
    w.y = c.y - 2*b.y + a.y;

    uu = 4*(w.x*w.x + w.y*w.y);

    if(uu < 0.00001)
    {
        return (float) Math.sqrt((c.x - a.x)*(c.x - a.x) + (c.y - a.y)*(c.y - a.y));
    }

    vv = 4*(v.x*w.x + v.y*w.y);
    ww = v.x*v.x + v.y*v.y;

    t1 = (float) (2*Math.sqrt(uu*(uu + vv + ww)));
    t2 = 2*uu+vv;
    t3 = vv*vv - 4*uu*ww;
    t4 = (float) (2*Math.sqrt(uu*ww));

    return (float) ((t1*t2 - t3*Math.log(t2+t1) -(vv*t4 - t3*Math.log(vv+t4))) / (8*Math.pow(uu, 1.5)));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.