সংলগ্ন ত্রিভুজ তৈরি করার জন্য অ্যালগরিদম


14

আমার একটি সিস্টেম রয়েছে যেখানে আপনি দৃশ্যে নোড রাখতে একবার ক্লিক করতে পারেন। আপনি 3 টি নোড রাখলে এটি একটি ত্রিভুজ গঠন করে। আপনি যখন ভবিষ্যতের কোনও নোড রাখেন, এটি নিকটবর্তী 2 টি বিদ্যমান নোডগুলিতে সেই নোডটিতে যোগদান করে একটি নতুন ত্রিভুজ তৈরি করে।

এটি বেশিরভাগ সময় সূক্ষ্মভাবে কাজ করে তবে ত্রুটিযুক্ত কোণগুলির সাথে ত্রিভুজগুলির নিকটে ব্যবহৃত হলে ত্রুটিযুক্ত হয়, কারণ নিকটস্থ 2 টি নোডের মধ্যে একটি প্রায়শই ব্যবহার করা উচিত নয়।

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

প্রকৃত এবং কাঙ্ক্ষিত আচরণের উদাহরণ

নতুন ত্রিভুজগুলি তৈরি করার সময় কোন 2 বিদ্যমান উল্লম্বটি ব্যবহার করতে হবে তা আমি কীভাবে নির্ধারণ করতে পারি যাতে ত্রিভুজগুলি এর মতো মহাকাশযুক্ত না হয়?

সম্পাদনা : নিকটতম প্রান্তটি অনুসন্ধান করা আরও ভাল ফলাফল দেয় , তবে নিখুঁত নয়। এই পরিস্থিতি বিবেচনা করুন:

এখানে চিত্র বর্ণনা লিখুন

'নিকটতম প্রান্ত' পরীক্ষাটি অস্পষ্ট, এবং AB বা এসি ফিরে আসতে পারে (উভয়ের জন্য X এর নিকটতম বিন্দু হিসাবে A এ)। পছন্দসই ফলাফলটি এসি হবে, কোনও প্রান্তকে ওভারল্যাপিং না করে এসিএক্স ত্রিভুজটি গঠনের জন্য। আমি কীভাবে এই ফলাফলটি নিশ্চিত করতে পারি? (যদি সম্ভব হয় তবে টাই-ব্রেকার হিসাবে স্বতন্ত্র প্রান্তের ওভারল্যাপ পরীক্ষা করতে হবে না কারণ আমি উদ্বিগ্ন যে নিকটতম প্রান্ত পরীক্ষাটি অবশ্যই দু'টি যথাযথভাবে সামঞ্জস্যপূর্ণ নয়, ভাসমান পয়েন্ট যথার্থ সমস্যাগুলি দেবে।)


স্থাপন করা শেষ 5 টি শীর্ষ কোণটি দেখার এবং নতুন স্থাপন করা শীর্ষবিন্দুর দুটি নিকটতমটি নির্বাচন করা কি যথেষ্ট ভাল নয়? আমি আপনাকে ত্রিভুজ স্ট্রিপগুলির জন্য অ্যালগরিদমগুলিতে নির্দেশ করব ( কোডারকর্নার / স্ট্রিপস htm ) তবে এগুলি প্রায়শই শেষ দুটি বা শেষ তিনটি এড়িয়ে যাওয়া ব্যবহার করে।
রায় টি।

1
সবুজ ত্রিভুজটি কি ম্যাজেন্টাটিকে ওভারল্যাপ করছে? এর লক্ষ্য কী? কোথায় এবং কীভাবে ত্রিভুজ তৈরি করা হয়েছে বা পয়েন্ট-ক্লাউডের ত্রিভুজ্যন গ্রহণযোগ্য হবে তা ব্যবহারকারীর নিয়ন্ত্রণ দরকার?
বাম্মজ্যাক

এটিকে কোনও গ্রাফের প্রসঙ্গে রাখার জন্য, কোনও প্রান্ত ওভারল্যাপিং ছাড়াই আপনি মূলত আপনার নোডগুলি সংযুক্ত করতে চান? (ধরে নিলাম ম্যাজেন্টা / সবুজ ত্রিভুজগুলি একটি প্রান্ত ভাগ করবে)
মাইকেলহাউস

রায় টি: না - কেবল 2 নিকটতমটিকে বেছে নেওয়া ভুল, কারণ আমি ভেবেছিলাম উদাহরণটি দেখায়। অস্পষ্ট কিছু? বুমজ্যাক - সবুজটি ম্যাজেন্টাটির সাথে ওভারল্যাপ করে না লক্ষ্যটি এই ত্রিভুজগুলির একটি জাল বা গ্রাফ তৈরি করা। হ্যাঁ, ব্যবহারকারীর নিয়ন্ত্রণ দরকার। বাইট 56 - হ্যাঁ, কোনও প্রান্ত অতিক্রম করা উচিত নয়।
কাইলোটন

2
ব্যবহারকারী কি স্বতন্ত্র ত্রিভুজ দেখতে পাবে? বা এটি একটি ধারাবাহিক পৃষ্ঠ হতে চলেছে?
বাম্মজ্যাক

উত্তর:


11

নোডের সর্বনিম্ন দূরত্ব সন্ধান করার পরিবর্তে প্রান্তের সর্বনিম্ন দূরত্বটি (যেমন নোড দ্বারা সংজ্ঞায়িত রেখাংশটি) সন্ধান করুন।

তারপরে, যদি নিকটতম বিন্দুটি একটি শীর্ষবিন্দু হয় (যা আপনাকে কিছু ভাসমান বিন্দুতে অ্যাপসিলন ** পরীক্ষা ব্যবহার করতে হবে), নতুন বিন্দু থেকে শীর্ষটি এবং সেই প্রান্তের সাথে সংযুক্ত প্রতিটি প্রান্তের মধ্যবর্তী কোণটির সাথে তুলনা করুন। সর্বনিম্ন পরম কোণ সহ একটি চয়ন করুন:

MinAngle(newPoint, vertex, edge1, edge2)
{
   newEdgeUnit = norm(newPoint - vertex); // don't actually need to normalize this
   edge1Unit = norm(edge1 - vertex);      // you probably have these from your dist to line tests
   edge2Unit = norm(edge2 - vertex);

   edge1Dot = dot(edge1Unit, newEdgeUnit);
   edge2Dot = dot(edge2Unit, newEdgeUnit);

   // you can simply compare dot products to find the minimum absolute angle
   if (edge1Dot > edge2Dot) return edge1;     // set up this way so you can generalize to an array
   return edge2;
}

** অধঃপতিত ত্রিভুজগুলি যুক্ত করা এড়ানোর জন্য, যা এপসিলন পরীক্ষায় বিঘ্ন ঘটতে পারে, আপনি প্রতিটি শীর্ষবিন্দুর চারপাশে এমন একটি অঞ্চল রাখতে চান যেখানে পয়েন্ট যুক্ত করার অনুমতি নেই, (উপরের কয়েকটি অ্যাপসিলনের একাধিকের মধ্যে পয়েন্টগুলি অস্বীকার করার মতো কিছু)।


3
+1 - এটি অন্যের তুলনায় অনেক বেশি সহজ উত্তর, এবং সঠিক ফলাফল সরবরাহ করার সম্ভাবনা বেশি IM দূরত্ব থেকে বিভাগটি স্মার্ট স্কিম সহ খুব সহজেই গণনা করা সহজ।
স্টিভেন স্টাডনিকি

সম্মত, এটি একটি ক্লিনার পদ্ধতি। সম্ভবত আমি যদি এখানে এসে
পৌঁছাতাম

আহ, এত কাছে! তবে, বাইট 5 এর উত্তর এবং জিমির ডায়াগ্রামের মতো, কখনও কখনও 2 টি সমতুল্য প্রান্ত থাকে এবং এর মধ্যে একটি সীমাবদ্ধতা লঙ্ঘন করে। আমি আমার প্রশ্ন আপডেট করেছি।
কাইলোটন

@ কাইলোটান সম্ভবত সেক্ষেত্রে কেবল কোনটি ওভারল্যাপ করে পরীক্ষা করে অন্য বিকল্পটি গ্রহণ করবে? আপনি যে প্রান্তটি বেছে নিয়েছেন সেগুলি ভাগ করে নেওয়ার জন্য ত্রিভুজগুলি সন্ধান করুন এবং আপনার নতুন ত্রিভুজটি বিদ্যমান প্রান্তটির মতো একই প্রান্তে রয়েছে কিনা তা পরীক্ষা করুন।
কেভিন রেড

@ কাইলোটান আপনি কি নিশ্চিত হন যে আপনার ত্রিভুজগুলিতে সর্বদা একই বাতাস থাকবে? যদি হ্যাঁ, আপনি আপনার নতুন ভার্টেক্স (ডট-পণ্য ব্যবহার করে) থেকে সাধারণ পয়েন্টিং দূরে এমন একটি প্রান্তটি বাতিল করতে পারেন।
বাম্মজ্যাক

6

প্রথম ত্রিভুজটি স্থাপন করার পরে, যখন একটি নতুন প্রান্তকে স্থাপন করবেন, আপনি সর্বদা দুটি নতুন প্রান্ত তৈরি করবেন। নতুন ত্রিভুজটির তৃতীয় প্রান্তটি সর্বদা পূর্ববর্তী ত্রিভুজ সহ একটি ভাগ করা প্রান্ত হবে। আপনি যদি ভাগ করা প্রান্তটি নির্ধারণের জন্য কোনও উপায় খুঁজে পেতে পারেন তবে আপনি কোন কোনটিকে সাথে সংযোগ করতে হবে তা জানতেন তবে এটি শক্ত অংশ। আমি বিশ্বাস করি যে আপনি এক নতুন উপায়টি তৈরি করতে পেরে আপনার নতুন ভার্টেক্স থেকে শেষ তিনটি প্রান্তের প্রতিটিের কেন্দ্রে (অথবা সম্ভবত 3 নিকটতম প্রান্ত) তৈরি করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন

প্রান্তের কেন্দ্রে আপনার প্রান্তবিন্দু থেকে লাইন হয়, তাহলে না অন্য দুটি প্রান্ত উভয় ক্রস, আপনি আপনার ভাগ প্রান্ত আছে। ভাগ করা প্রান্তটি আপনাকে বলবে যে দুটি নতুন শীর্ষে আপনার নতুন শীর্ষবিন্দুর সাথে সংযোগ স্থাপন করতে হবে।

জিমি একটি বিষয়টির জন্য এটি নিয়ে এসেছিল যেটি দ্বিগুণ যেটি নতুন ত্রিভুজটি এরকম হবে যেখানে:

অস্পষ্ট ত্রিভুজ

এটি আপনাকে দুটি বৈধ ত্রিভুজগুলির মধ্যে নির্বাচন করার সুযোগ দেবে। সম্ভবত টাই ব্রেকিং যা কেন্দ্রের পয়েন্টটি নিকটতম।

আপনার আপডেটটি বিবেচনা করে, আরও জটিল হওয়ার সাথে সাথে, আমার সমাধানটি কেবল তখনই টাই হয়ে যাবে যখন আপনার দুটি বৈধ ত্রিভুজ রয়েছে। এই পদ্ধতিটি ব্যবহার করে আপনার দ্বিতীয় উদাহরণের চিত্রটি আপনার পছন্দমতো ফলাফল আনবে।

এখানে চিত্র বর্ণনা লিখুন


এমন পরিস্থিতি পাওয়া সম্ভব যেখানে দুটি রেখার প্রান্তটি ছেদ না করে (যখন এক্স প্রান্তের চেয়ে প্রান্তের কাছাকাছি থাকে)
জিমি

@ জিমি আপনি কি এ জাতীয় পরিস্থিতির চিত্র আঁকতে পারবেন?
মাইকেলহাউস


হ্যাঁ হ্যাঁ, তাহলে ত্রিভুজটি কোথায় রাখবেন তার দুটি বিকল্প আছে! উভয় পক্ষ কাজ করবে। কেন্দ্রের সবচেয়ে কম দূরত্বের সাথে সম্ভবত আপনি ব্রেকটি বেঁধে রাখতে পারেন।
মাইকেলহাউস

@ কাইলোটান এই সমাধান কাজ করে না? আপনি জেফের কাছে একটি মন্তব্যে উল্লেখ করেছিলেন যে জিমির চিত্রটিতে দুটি মামলা রয়েছে এবং একটিতে সীমাবদ্ধতা লঙ্ঘন করা হয়েছে, তবে এটি সত্য নয়। জিমির ছবিতে দুটি ক্ষেত্রেই আমার পদ্ধতিটি ব্যবহার করে বৈধ ত্রিভুজ তৈরি করা হবে।
MichaelHouse

1

আপনার ম্যাজেন্টা ত্রিভুজটি এবিসি রাখার পরে আপনি একটি নতুন ভার্টেক্স এক্স অন্তর্ভুক্ত করবেন I আমি মনে করি এটা স্পষ্ট যে ডি থেকে শুরু হওয়া দুটি রেখা থাকবে যা ত্রিভুজের ABC এর কোনও প্রান্তের সাথে ছেদ করবে না।

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


এটি দুর্দান্ত বলে মনে হচ্ছে, তবে আপনি যেভাবে বলেছেন তা মনে হয় যে কেবলমাত্র একটি বিদ্যমান ত্রিভুজ রয়েছে। কিভাবে এটি অনেকের কাছে সাধারণীকরণ হবে?
কাইলোটন

হুম ... যদি আপনার এক্স এবং আপনার ত্রিভুজটি এবিসি স্থির হয় তবে আমার ধারণা কেবল একটি আছে, তাই না?
ড্যান

সিস্টেমটি দ্বিতীয় নোডের পরে প্রতিটি নোডের জন্য একটি নতুন ত্রিভুজ তৈরি করে।
কাইলোটন

দুঃখিত, আমি আপনার প্রশ্ন ভুল বুঝেছি। আমাকে দেখতে দিন কীভাবে আমি এটি বহু ত্রিভুজগুলিতে প্রসারিত করতে পারি।
ড্যান

ভাল আমি অনুমান করি আপনি এক্স এর দুটি নিকটতম উল্লম্ব অনুসন্ধান করতে পারবেন যা এক্স এর সাথে সংযুক্ত থাকাকালীন কোনও প্রান্তটি অতিক্রম করবে না?
বামমজ্যাক

1

আপনি যদি কোনও দ্ব্যর্থহীন অঞ্চলে (1, 2, 3) নীচে থাকেন তবে তা নির্ধারণ করা মোটামুটি সহজ: আপনার ত্রিভুজের প্রতিটি প্রান্তকে 2 ডি বিমান হিসাবে বিবেচনা করুন এবং আপনার নতুন পয়েন্টটি বিমানের কোন দিকে রয়েছে তা পরীক্ষা করুন। আপনি যদি তার মধ্যে দুটি এর বাইরে থাকেন তবে একটির বাইরে, তবে এটি একটি ত্রিভুজটির প্রান্তের সাথে মিলিত হয় যা আপনার নতুন ত্রিভুজের সাথে দুটি সূচকে অবদান রাখে।

ত্রিভুজের ভোরোনাই অঞ্চল

যদি আপনি এক এবং দু'জনের বাইরে থাকেন তবে আপনি দ্ব্যর্থক ক্ষেত্রে যেখানে আপনার নতুন পয়েন্টের ত্রিভুজটির নিকটতম অংশটি কোণা। সেক্ষেত্রে, আপনি বিপরীত প্রান্তের মাঝামাঝি (যেটি আপনি এর মধ্যে রয়েছেন) এবং নিকটতম মেরুদণ্ডের (আপনি যে দুটি বিমানের বাইরের সাথে ভাগ করেছেন সেটিকে ভাগ করে নেওয়া) মধ্য থেকে 2 ডি প্লেন তৈরি করতে পারেন। আপনার নতুন পয়েন্টটি এই বিমানের কোন দিকে রয়েছে তার উপর নির্ভর করে আপনি একটি কিনারা চয়ন করতে পারেন।

দ্রষ্টব্য যে 2 ডি তে একটি বিমান পরীক্ষা 3 ডি তে একইভাবে কাজ করে: সমতলের যে কোনও জায়গা থেকে আপনার বিন্দুতে বিমানের স্বাভাবিকের সাথে বিন্দুতে একটি ভেক্টরকে বিন্দু করুন (2 ডি-তে এটি লাইনটির লম্ব লম্ব হয়)।

(প্রসঙ্গক্রমে, এই চিত্রের ম্যাজেন্টা-বিস্মৃত অঞ্চলগুলিকে ভোরোনাই অঞ্চল বলা হয়; এগুলি এমন স্থানের অঞ্চল যা একটি নির্দিষ্ট বৈশিষ্ট্য - ত্রিভুজের একটি প্রান্ত বা প্রান্তিকের to নিকটবর্তী।) সম্পাদনা: এখানে আমার পরিভাষা আসলে নেই বেশ সঠিক, এগুলি ঠিক ভোরোনাই অঞ্চল নয়))


এটি দৃশ্যের একাধিক ত্রিভুজগুলিকে কীভাবে সাধারণী করে তোলে তা তাত্ক্ষণিকভাবে আমার কাছে স্পষ্ট হয় না - বিশেষত যদি নিকটতম বৈশিষ্ট্যটি এমন একটি শীর্ষবিন্দু যা 1 টিরও বেশি ত্রিভুজ দ্বারা ভাগ করা যায়।
কাইলোটন

@ কাইলোটান সমস্ত ত্রিভুজগুলির জন্য কেবল অ্যালগরিদম চালান, এবং সামগ্রিক নিকটতম বৈশিষ্ট্যটি চয়ন করুন। আপনার কিছু টাই ব্রেকিং লজিক দরকার যাই হোক না কেন। আপনি নিকটতম বৈশিষ্ট্য দিয়ে শেষ একটি ভাগ প্রান্তবিন্দু হচ্ছে, তাহলে আপনি উচিত শুধুমাত্র এক ত্রিভুজ জন্য প্রান্ত অঞ্চলে (# 1, # 2, # 3) হতে, তাই হয়তো আপনি যে বাছাই করতে পারেন?
জন কলসবেইক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.