সমানভাবে গোলকের উপর n পয়েন্ট বিতরণ করা


120

আমার একটি অ্যালগরিদম দরকার যা আমাকে এন পয়েন্টগুলির জন্য গোলকের চারপাশে অবস্থান দিতে পারে (সম্ভবত ২০ এরও কম) সম্ভবত এগুলি অস্পষ্টভাবে ছড়িয়ে দেয়। "নিখুঁততা" লাগানোর দরকার নেই, তবে আমার কেবল এটির প্রয়োজন তাই এগুলির কোনওটিই একসাথে মিলে না।

  • এই প্রশ্নটি ভাল কোড সরবরাহ করেছে, তবে আমি এই ইউনিফর্মটি তৈরির উপায় খুঁজে পাইনি, কারণ এটি 100% এলোমেলো মনে হয়েছিল।
  • এই ব্লগ পোস্টে গোলকের উপর পয়েন্ট সংখ্যার ইনপুট দেওয়ার অনুমতি দেওয়ার দুটি উপায় ছিল, তবে সাফ এবং কুজিলারস অ্যালগরিদম হ'ল আমি প্রতিলিপি করতে পারলাম, এবং কোড উদাহরণটি পাওয়া গেছে যে "নোড [কে]" রয়েছে, যা আমি পারি না দেখুন দেখুন এবং সম্ভাবনা নষ্ট। দ্বিতীয় ব্লগের উদাহরণটি হ'ল গোল্ডেন সেকশন সর্পিল, যা আমাকে অদ্ভুত করেছে, ফলাফলগুলি গুছিয়েছে, ধ্রুবক ব্যাসার্ধ নির্ধারণ করার কোনও সুস্পষ্ট উপায় ছাড়াই।
  • এই প্রশ্ন থেকে এই অ্যালগরিদম সম্ভবত এটি কাজ করতে পারে বলে মনে হয়, তবে আমি সেই পৃষ্ঠায় যা আছে তা psuedocode বা অন্য কোনও কিছুর মধ্যে একসাথে টুকরা করতে পারি না।

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

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


"কিছুটা এলোমেলোকরণের সাথে" আপনার অর্থ কী? আপনি কি কোনও অর্থে বিশৃঙ্খলা বোঝাতে চান?
নিনজাগেকো

32
ওপি বিভ্রান্ত। তিনি যা খুঁজছেন তা হল একটি গোলকের উপরে এন-পয়েন্ট স্থাপন করা, যাতে যে কোনও দুটি পয়েন্টের মধ্যে সর্বনিম্ন দূরত্ব যতটা সম্ভব বড় হয়। এটি পয়েন্টগুলি পুরো ক্ষেত্রের "সমানভাবে বিতরণ" হওয়ার চেহারা দেবে। এটি একটি গোলকের উপর অভিন্ন র্যান্ডম বিতরণ তৈরির সাথে সম্পূর্ণরূপে সম্পর্কিত নয়, যা এই লিঙ্কগুলির মধ্যে অনেকগুলি সম্পর্কে, এবং নীচের উত্তরগুলির মধ্যে অনেকগুলি কী সম্পর্কে কথা বলছে।
ব্লুরাজা - ড্যানি পিফ্লুঘোফুট

1
আপনি যদি এগুলি কেবল এলোমেলো দেখতে না চান তবে 20 কোনও গোলকের উপরে রাখার জন্য অনেকগুলি পয়েন্ট নয়।
জন আলেক্সিউ

2
এটি করার একটি উপায় এখানে রয়েছে (এর কোড উদাহরণ রয়েছে): pdfs.semanticscholar.org/97a6/… (দেখে মনে হচ্ছে এটি বিকর্ষণ শক্তি গণনা ব্যবহার করে)
ট্রাস্ক্রিট

1
অবশ্যই on 4, 6, 8, 12, 20 N এ N এর মানগুলির জন্য সঠিক সমাধান বিদ্যমান যেখানে প্রতিটি বিন্দু থেকে (প্রতিটি) এর নিকটতম প্রতিবেশী সমস্ত পয়েন্ট এবং সমস্ত নিকটবর্তী প্রতিবেশীদের জন্য স্থির থাকে।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

উত্তর:


13

ইন এই উদাহরণে কোড node[k] শুধু kth নোড হয়। আপনি একটি অ্যারে এন পয়েন্ট তৈরি করছেন এবং node[k]এটি কেথ (০ থেকে এন -১ পর্যন্ত)। যদি এটি আপনাকে বিভ্রান্ত করে তোলে তবে আশা করি আপনি এখন এটি ব্যবহার করতে পারবেন।

(অন্য কথায়, kআকার এন এর অ্যারে যা কোড টুকরাটি শুরুর আগে সংজ্ঞায়িত করা হয় এবং এতে পয়েন্টগুলির একটি তালিকা রয়েছে)।

বিকল্পভাবে , এখানে অন্য উত্তর তৈরি করা (এবং পাইথন ব্যবহার করে):

> cat ll.py
from math import asin
nx = 4; ny = 5
for x in range(nx):
    lon = 360 * ((x+0.5) / nx)
    for y in range(ny):                                                         
        midpt = (y+0.5) / ny                                                    
        lat = 180 * asin(2*((y+0.5)/ny-0.5))                                    
        print lon,lat                                                           
> python2.7 ll.py                                                      
45.0 -166.91313924                                                              
45.0 -74.0730322921                                                             
45.0 0.0                                                                        
45.0 74.0730322921                                                              
45.0 166.91313924                                                               
135.0 -166.91313924                                                             
135.0 -74.0730322921                                                            
135.0 0.0                                                                       
135.0 74.0730322921                                                             
135.0 166.91313924                                                              
225.0 -166.91313924                                                             
225.0 -74.0730322921                                                            
225.0 0.0                                                                       
225.0 74.0730322921                                                             
225.0 166.91313924
315.0 -166.91313924
315.0 -74.0730322921
315.0 0.0
315.0 74.0730322921
315.0 166.91313924

যদি আপনি এটির পরিকল্পনা করেন তবে আপনি দেখতে পাবেন যে মেরুগুলির নিকটে উল্লম্ব ব্যবধানটি বৃহত্তর যাতে প্রতিটি বিন্দুটি একই মোট জায়গার প্রায় স্থানে অবস্থিত (মেরুগুলির নিকটে কম স্থান "অনুভূমিকভাবে" থাকে, সুতরাং এটি আরও "উল্লম্ব" দেয় )।

এটি তাদের প্রতিবেশীদের একই দূরত্ব সম্পর্কে সমস্ত পয়েন্টের সমান নয় (যা আমি মনে করি যে আপনার লিঙ্কগুলিই কথা বলছে) তবে এটি আপনি যা চান তার পক্ষে যথেষ্ট এবং কেবল অভিন্ন ল্যাট / দীর্ঘ গ্রিড তৈরির ক্ষেত্রে উন্নতি হতে পারে ।


চমৎকার, গাণিতিক সমাধানটি দেখতে ভাল। আমি একটি হেলিক্স এবং তোরণ দৈর্ঘ্যের বিচ্ছেদ ব্যবহার করার কথা ভাবছিলাম। আকর্ষণীয় সমস্যা যা সর্বোত্তম সমাধান কীভাবে পাবেন তা সম্পর্কে আমি এখনও নিশ্চিত নই।
রবার্ট রাজা

আপনি কি দেখেছেন যে আমি উপরে নোড [কে] এর ব্যাখ্যা অন্তর্ভুক্ত করার জন্য আমার উত্তরটি সম্পাদনা করেছি? আমি মনে করি এটি আপনার প্রয়োজন হতে পারে ...
অ্যান্ড্রু कूক

বিস্ময়কর, ব্যাখ্যা জন্য ধন্যবাদ। আমি বর্তমানে এটি চেষ্টা করব, কারণ আমার কাছে সময় নেই, তবে আমাকে সাহায্য করার জন্য আপনাকে অনেক ধন্যবাদ। আমি আপনাকে জানাব যে এটি কীভাবে আমার উদ্দেশ্যে কাজ করে। ^^
২১:০6 এ

সর্পিল পদ্ধতিটি ব্যবহার করে আমার প্রয়োজনগুলি পুরোপুরি ফিট করে, সাহায্য এবং স্পষ্টতার জন্য অনেক ধন্যবাদ। :)
স্পর্শ

13
লিঙ্কটি মারা গেছে বলে মনে হচ্ছে।
স্কিনডোড

139

ফিবোনাচি গোলকের অ্যালগরিদম এটির জন্য দুর্দান্ত। এটি দ্রুত এবং ফলাফল দেয় যা এক নজরে সহজেই মানুষের চোখকে বোকা বানাবে। আপনি প্রসেসিংয়ের সাথে সম্পন্ন একটি উদাহরণ দেখতে পাচ্ছেন যা পয়েন্ট যুক্ত হওয়ার সাথে সাথে ফলাফলটি প্রদর্শন করবে। এখানে @gman দ্বারা তৈরি আরও একটি দুর্দান্ত ইন্টারেক্টিভ উদাহরণ । অজগরটিতে এখানে একটি সাধারণ বাস্তবায়ন।

import math


def fibonacci_sphere(samples=1):

    points = []
    phi = math.pi * (3. - math.sqrt(5.))  # golden angle in radians

    for i in range(samples):
        y = 1 - (i / float(samples - 1)) * 2  # y goes from 1 to -1
        radius = math.sqrt(1 - y * y)  # radius at y

        theta = phi * i  # golden angle increment

        x = math.cos(theta) * radius
        z = math.sin(theta) * radius

        points.append((x, y, z))

    return points

1000 টি নমুনা আপনাকে এটি দেয়:

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


phi: phi = ((i + rnd)% n) * ইনক্রিমেন্ট সংজ্ঞায়িত করার সময় একটি ভেরিয়েবল এন বলা হয়। এন = নমুনা আছে?
অ্যান্ড্রু স্টারোসাইক

@ অ্যান্ড্রুস্টারোসাইক হ্যাঁ! আমি যখন প্রথম কোডটি লিখি তখন আমি ভেরিয়েবল হিসাবে "এন" ব্যবহার করি এবং পরে নামটি পরিবর্তন করি তবে যথাযথ অধ্যবসায় করি না। এটি ধরার জন্য ধন্যবাদ!
Fnord


4
@ Xarbrough কোডটি আপনাকে একটি ইউনিট গোলকের চারপাশে পয়েন্ট দেয়, সুতরাং ব্যাসার্ধের জন্য যা কিছু স্কেলার চান তা কেবল প্রতিটি পয়েন্টকে গুণান।
ফনর্ড

2
@ ফনর্ড: আমরা কি উচ্চ মাত্রার জন্য এটি করতে পারি?
পিকছুচামিলিয়ন

108

সোনার সর্পিল পদ্ধতি

আপনি বলেছিলেন যে আপনি সোনার সর্পিল পদ্ধতিটি কাজ করতে পারবেন না এবং এটি লজ্জাজনক কারণ এটি সত্যই, সত্যিই ভাল। আমি আপনাকে এটি সম্পর্কে একটি সম্পূর্ণ ধারণা দিতে চাই যাতে সম্ভবত আপনি কীভাবে এটিকে "গুছিয়ে রাখা" থেকে দূরে রাখতে পারবেন তা বুঝতে পারেন।

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

প্রাইমার: ইউনিট ডিস্কে সূর্যমুখী সর্পিল

এই অ্যালগরিদমটি বোঝার জন্য, আমি আপনাকে প্রথমে 2 ডি সূর্যমুখী সর্পিল অ্যালগরিদমটি দেখার জন্য আমন্ত্রণ জানাচ্ছি। এটি এই সত্যের উপর ভিত্তি করে তৈরি হয় যে সর্বাধিক অযৌক্তিক সংখ্যাটি হ'ল সোনার অনুপাত (1 + sqrt(5))/2এবং "যদি কেউ" কেন্দ্রে দাঁড়ান, পুরো বাঁকগুলির একটি সুবর্ণ অনুপাত ঘুরিয়ে দেন, তবে সেই দিকটিতে অন্য একটি বিন্দু নির্গত হন, "একটি স্বাভাবিকভাবেই একটি গঠন করে সর্পিল যা আপনি উচ্চ ও উচ্চতর সংখ্যক পয়েন্টগুলিতে পৌঁছালেও তবুও পয়েন্টগুলি লাইন রাখার মতো 'বার' ভালভাবে সংজ্ঞায়িত করতে অস্বীকার করে। (নোট 1.)

একটি ডিস্কে এমনকি ব্যবধানের জন্য অ্যালগরিদম হ'ল

from numpy import pi, cos, sin, sqrt, arange
import matplotlib.pyplot as pp

num_pts = 100
indices = arange(0, num_pts, dtype=float) + 0.5

r = sqrt(indices/num_pts)
theta = pi * (1 + 5**0.5) * indices

pp.scatter(r*cos(theta), r*sin(theta))
pp.show()

এবং এটি (n = 100 এবং n = 1000) এর মতো দেখতে ফলাফল তৈরি করে:

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

পয়েন্টগুলি রেডিয়ালি ফাঁক করে দেওয়া

মূল আজব জিনিসটি সূত্র r = sqrt(indices / num_pts); আমি কীভাবে তার কাছে এসেছি? (দ্রষ্টব্য ২)

ঠিক আছে, আমি এখানে স্কোয়ার রুটটি ব্যবহার করছি কারণ আমি এগুলি ডিস্কের চারপাশে সম-অঞ্চল ফাঁকা রাখতে চাই। এটি একই বলে যে বৃহত এন এর সীমাতে আমি তার অঞ্চলটির সাথে আনুপাতিক সংখ্যক পয়েন্ট ধারণ করতে একটি ছোট অঞ্চল R ∈ ( r , r + d r ), Θ ∈ ( θ , θ + d θ ) চাই, যা r d r d θ । এখন যদি আমরা ভান করি যে আমরা এখানে একটি এলোমেলো পরিবর্তনশীল সম্পর্কে কথা বলছি, তবে এটির সরল ব্যাখ্যা আছে যে ( আর , Θ ) এর জন্য যৌথ সম্ভাবনার ঘনত্বটি কেবল সিআরকিছু ধ্রুবক জন্য । ইউনিট ডিস্কে সাধারণকরণ এরপরে c = 1 / force জোর করে π

এখন আমাকে একটি কৌশল চালু করা যাক। এটি সম্ভাব্যতা তত্ত্ব থেকে আসে যেখানে এটি বিপরীত সিডিএফের নমুনা হিসাবে পরিচিত : মনে করুন আপনি একটি সম্ভাব্য ঘনত্ব এফ ( জেড ) দিয়ে একটি এলোমেলো পরিবর্তনশীল তৈরি করতে চেয়েছিলেন এবং আপনার একটি র্যান্ডম ভেরিয়েবল ইউ -ইউনিফর্ম (0, 1) রয়েছে ঠিক তেমনই বেশিরভাগ প্রোগ্রামিং ভাষায়। তুমি এটা কিভাবে করো?random()

  1. প্রথমে আপনার ঘনত্বকে একটি ক্রম বিতরণ ফাংশন বা সিডিএফে পরিণত করুন, যা আমরা এফ ( জেড ) বলব । একটি সিডিএফ, মনে রাখবেন, ডেরিভেটিভ এফ ( জেড ) এর সাথে 0 থেকে 1 এ একতরফাভাবে বৃদ্ধি পায় ।
  2. তারপরে সিডিএফের বিপরীতমুখী ফাংশন এফ -1 ( জেড ) গণনা করুন ।
  3. আপনি দেখতে পাবেন যে জেড = এফ -1 ( ইউ ) লক্ষ্য ঘনত্ব অনুযায়ী বিতরণ করা হয়েছে। (নোট 3).

এখন সোনালি-অনুপাতের সর্পিল ট্রিকটি পয়েন্টগুলি একটি সুন্দর এমনকি প্যাটার্নে ফাঁকা করে θ সুতরাং আসুন এটি একীভূত করা যাক; ইউনিট ডিস্কের জন্য আমরা এফ ( আর ) = আর 2 দিয়ে রেখেছি । সুতরাং বিপরীত ফাংশনটি হ'ল F -1 ( u ) = u 1/2 , এবং সেইজন্য আমরা ডিস্কের সাথে মেরু স্থানাঙ্কে এলোমেলো পয়েন্ট উত্পন্ন করব r = sqrt(random()); theta = 2 * pi * random()

এখন এলোমেলোভাবে এই বিপরীত ফাংশনটি নমুনা দেওয়ার পরিবর্তে আমরা এটি অভিন্নভাবে নমুনা দিচ্ছি , এবং ইউনিফর্ম নমুনা সম্পর্কে চমৎকার বিষয়টি হল যে বড় এন এর সীমাতে পয়েন্টগুলি কীভাবে ছড়িয়ে পড়েছে সে সম্পর্কে আমাদের ফলাফলগুলি আচরণ করবে যেন আমরা এলোমেলোভাবে নমুনা রেখেছি। এই সংমিশ্রণটি কৌশলটি। পরিবর্তে random()আমরা ব্যবহার করুন (arange(0, num_pts, dtype=float) + 0.5)/num_pts, যাতে, বলুন, যদি আমরা 10 পয়েন্ট সেগুলি নমুনা করতে চাই r = 0.05, 0.15, 0.25, ... 0.95। আমরা অবিশেষে নমুনা সমান-অঞ্চল ব্যবধান পেতে, এবং আমরা সূর্যমুখী বৃদ্ধি ব্যবহার ভয়াবহ আউটপুটে পয়েন্ট "বার" এড়ানো।

এখন একটি গোলকের উপর সূর্যমুখী করছেন

পয়েন্টগুলি সহ গোলকের বিন্দুতে আমাদের যে পরিবর্তনগুলি করা দরকার তা হ'ল গোলাকার স্থানাঙ্কগুলির জন্য মেরু স্থানাঙ্কগুলি সরিয়ে নেওয়া জড়িত। অবশ্যই রেডিয়াল সমন্বয় এটিতে প্রবেশ করে না কারণ আমরা একটি ইউনিট গোলকের মধ্যে আছি। জিনিসগুলিকে এখানে কিছুটা সামঞ্জস্যপূর্ণ রাখতে, যদিও আমি একজন পদার্থবিদ হিসাবে প্রশিক্ষণ পেয়েছি আমি গণিতবিদদের স্থানাঙ্ক ব্যবহার করব যেখানে 0 ≤ φ ≤ lat মেরু থেকে অক্ষাংশ নিচে নেমে আসছে এবং 0 ≤ θ ≤ 2π দ্রাঘিমাংশ হয়। উপরে থেকে পার্থক্য সুতরাং যে আমরা মূলত পরিবর্তনশীল প্রতিস্থাপন করা হয় সঙ্গে φ

আমাদের এলাকায় উপাদান, যা ছিল θ , এখন না অনেক-আরো-জটিল পাপ (হয়ে φ ) ঘ φθ । সুতরাং অভিন্ন ব্যবধানের জন্য আমাদের যৌথ ঘনত্ব হ'ল পাপ ( φ ) / 4π π Θ সংহত করে , আমরা f ( φ ) = sin ( φ ) / 2 খুঁজে পাই , এইভাবে F ( φ ) = (1 - কোস ( φ )) / 2। এটি উল্টিয়ে আমরা দেখতে পাচ্ছি যে অভিন্ন র্যান্ডম ভেরিয়েবলটি আকোসের (1 - 2 u ) মত দেখাবে , তবে আমরা এলোমেলো পরিবর্তে অভিন্নরূপে নমুনা করি, তাই আমরা পরিবর্তে φ কে = একোস (1 - 2 ( কে) ব্যবহার করি+ 0.5) / এন )। এবং বাকি অ্যালগরিদম কেবল এক্স, ওয়াই এবং জেড স্থানাঙ্কের মধ্যে এটি প্রজেক্ট করছে:

from numpy import pi, cos, sin, arccos, arange
import mpl_toolkits.mplot3d
import matplotlib.pyplot as pp

num_pts = 1000
indices = arange(0, num_pts, dtype=float) + 0.5

phi = arccos(1 - 2*indices/num_pts)
theta = pi * (1 + 5**0.5) * indices

x, y, z = cos(theta) * sin(phi), sin(theta) * sin(phi), cos(phi);

pp.figure().add_subplot(111, projection='3d').scatter(x, y, z);
pp.show()

আবার এন = 100 এবং এন = 1000 এর জন্য ফলাফলগুলি দেখতে দেখতে: এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

আরও গবেষণা

আমি মার্টিন রবার্টসের ব্লগে একটি চিৎকার দিতে চেয়েছিলাম। নোট করুন যে উপরে আমি প্রতিটি সূচকে 0.5 যোগ করে আমার সূচকগুলির একটি অফসেট তৈরি করেছি। এটি কেবল আমার কাছে দৃষ্টি আকর্ষণীয় ছিল, তবে এটি প্রমাণিত হয়েছে যে অফসেটের পছন্দটি অনেক বিষয় বিবেচনা করে এবং অন্তরের সাথে ধ্রুবক নয় এবং সঠিকভাবে চয়ন করা হলে প্যাকিংয়ের ক্ষেত্রে 8% এর চেয়ে বেশি যথার্থতা পাওয়ার অর্থ হতে পারে। কোনও গোলকটি cover েকে দেওয়ার জন্য তার আর ক্রম পাওয়ারও একটি উপায় থাকতে হবে এবং এটি আকর্ষণীয়ও হবে যে এটি একটি দুর্দান্ত এমনকি আচ্ছাদনও তৈরি করেছে, সম্ভবত যেমন আছে তবে সম্ভবত প্রয়োজন ছিল, বলার অপেক্ষা রাখে না, কেবল অর্ধেক থেকে নেওয়া ইউনিট বর্গক্ষেত্রটি তির্যকভাবে কাটা বা কাটা এবং একটি বৃত্ত পেতে চারদিকে প্রসারিত।

মন্তব্য

  1. এই "বারগুলি" সংখ্যার সাথে যুক্তিযুক্ত আনুষঙ্গিকতার দ্বারা গঠিত হয়, এবং সংখ্যার সর্বোত্তম যুক্তিসঙ্গত অনুমানগুলি তার অব্যাহত ভগ্নাংশ প্রকাশ থেকে আসে, z + 1/(n_1 + 1/(n_2 + 1/(n_3 + ...)))যেখানে zএকটি পূর্ণসংখ্যা এবং n_1, n_2, n_3, ...হয় হয় ইতিবাচক পূর্ণসংখ্যার একটি সীমাবদ্ধ বা অসীম অনুক্রম:

    def continued_fraction(r):
        while r != 0:
            n = floor(r)
            yield n
            r = 1/(r - n)

    যেহেতু ভগ্নাংশের অংশটি 1/(...)সর্বদা শূন্য এবং একের মধ্যে থাকে, অবিরত ভগ্নাংশের একটি বড় পূর্ণসংখ্যা বিশেষত ভাল যুক্তিযুক্ত আনুমানিকতার জন্য অনুমতি দেয়: "100 এবং 101 এর মধ্যে যে কোনও কিছু দ্বারা বিভক্ত একটি" "1 থেকে 2 এর মধ্যে বিভক্ত একের চেয়ে ভাল" is সর্বাধিক অযৌক্তিক সংখ্যাটি হ'ল এটি একটি 1 + 1/(1 + 1/(1 + ...))এবং এটিতে বিশেষত ভাল যুক্তিযুক্ত আনুমানিকতা নেই; এক সমাধান করতে পারে φ = 1 + 1 টি / φ দ্বারা মাধ্যমে গুন দ্বারা φ সুবর্ণ অনুপাত জন্য সূত্র জন্য।

  2. যেসব লোক NumPy এর সাথে এতটা পরিচিত নন - তাদের সমস্ত ক্রিয়াকলাপই "ভেক্টরাইজড", যাতে sqrt(array)অন্য ভাষাগুলি কী লিখতে পারে তার মতোই map(sqrt, array)। সুতরাং এটি একটি উপাদান-দ্বারা-উপাদান sqrtঅ্যাপ্লিকেশন। এটি একইভাবে একটি স্কেলার দ্বারা বিভাজন বা স্কেলারের সাথে সংযোজনকে ধারণ করে - এগুলি সমান্তরালভাবে সমস্ত উপাদানগুলিতে প্রয়োগ হয়।

  3. প্রমাণটি সহজ আপনি একবার জানেন যে এটি ফলাফল। আপনি জিজ্ঞাসা সম্ভাব্যতা যে z- র < টু Z < z- র + D z- র , এই জিজ্ঞাসা কি সম্ভাব্যতা যে হিসাবে একই z- র < এফ -1 ( ইউ ) < z- র + D z- র আবেদন এফ লক্ষ এটা যে সব তিনটি এক্সপ্রেশন থেকে একঘেয়েমি ক্রমবর্ধমান ফাংশন, তাই এফ ( জেড ) < ইউ < এফ ( জেড + ডি জেড ), এফ ( জেড ) + সন্ধানের জন্য ডান হাতটি প্রসারিত করুন( z ) d z , এবং যেহেতু ইউ অভিন্ন তাই এই সম্ভাবনাটি কেবল f ( z ) d z হিসাবে প্রতিশ্রুতিবদ্ধ।


4
আমি নিশ্চিত নই কেন এটি এত নিচে রয়েছে, এটি করার পক্ষে এটি এখন পর্যন্ত সেরা সেরা পদ্ধতি।
WHN

2
@ এসএনবি এই ধরনের শব্দগুলির জন্য আপনাকে ধন্যবাদ! এটি এতটা অংশে নিচে রয়েছে কারণ এটি এখানে থাকা সমস্ত উত্তরগুলির চেয়ে অনেক কম। আমি অবাক হয়েছি যে এটি এমনকি যেমনটি হয়েছে তেমনি করছে।
সিআর ড্রস্ট

আমার কাছে একটি প্রশ্ন রয়ে গেছে: কোন দুটি পয়েন্টের মধ্যে প্রদত্ত সর্বোচ্চ দূরত্বের জন্য আমার কতগুলি পয়েন্ট এন বিতরণ করতে হবে?
ফেলিক্স ডি

1
@FelixD। এটি এমন প্রশ্নের মতো মনে হচ্ছে যা খুব দ্রুত জটিল হয়ে উঠতে পারে বিশেষত আপনি যদি ইউক্লিডিয়ান দূরত্বের পরিবর্তে দুর্দান্ত বৃত্তের দূরত্বগুলি ব্যবহার শুরু করেন। তবে আমি একটি সাধারণ প্রশ্নের উত্তর দিতে পারি, যদি কেউ গোলকের দিকের বিন্দুগুলিকে তাদের ভোরোনাই চিত্রের সাথে রূপান্তরিত করে, তবে প্রতিটি ভোরোনাই কোষটি প্রায় 4π / N অঞ্চল হিসাবে বর্ণনা করতে পারে এবং এটি একটি বৃত্তের ভান করে এটিকে একটি চরিত্রগত দূরত্বে রূপান্তর করতে পারে একটি গম্বুজ চেয়ে, πr² = 4π / এন। তারপরে আর = 2 / √ (এন)।
সিআর ড্রস্ট

2
এলোমেলোভাবে-ইউনিফর্ম ইনপুটের পরিবর্তে প্রকৃতপক্ষে ইউনিফর্মের সাথে স্যাম্পলিং উপপাদ্যটি ব্যবহার করা আমাকে সেই জিনিসগুলির মধ্যে একটি বলে যে "আচ্ছা, কেন # $% & আমি কেন এটি ভাবিনি?" । খুশী হলাম।
ডিএমকেই --- প্রাক্তন-মডারেটর বিড়ালছানা

86

এটি একটি গোলকের প্যাকিং পয়েন্ট হিসাবে পরিচিত, এবং কোনও (জ্ঞাত) সাধারণ, নিখুঁত সমাধান নেই। তবে প্রচুর অপূর্ণ সমাধান রয়েছে। তিনটি সর্বাধিক জনপ্রিয় বলে মনে হচ্ছে:

  1. একটি সিমুলেশন তৈরি করুন । প্রতিটি পয়েন্টকে একটি গোলকের সীমাবদ্ধ একটি ইলেক্ট্রন হিসাবে আচরণ করুন, তারপরে নির্দিষ্ট কয়েকটি পদক্ষেপের জন্য একটি সিমুলেশন চালান। ইলেক্ট্রনগুলির বিকর্ষণটি স্বাভাবিকভাবেই সিস্টেমটিকে আরও স্থিতিশীল অবস্থায় নিয়ে যায়, যেখানে পয়েন্টগুলি একে অপরের থেকে যতটা দূরে তারা পেতে পারে।
  2. হাইপারকিউব প্রত্যাখ্যান । অভিনব-শোনানোর এই পদ্ধতিটি আসলেই সহজ: আপনি গোলকের চারপাশে ঘনক্ষেত্রের অভ্যন্তরের ভিতরে অভিন্নভাবে পয়েন্টগুলি ( nতাদের তুলনায় অনেক বেশি ) চয়ন করেন, তারপরে গোলকের বাইরের পয়েন্টগুলি প্রত্যাখ্যান করুন। অবশিষ্ট পয়েন্টগুলি ভেক্টর হিসাবে আচরণ করুন এবং সেগুলি স্বাভাবিক করুন। এগুলি আপনার "নমুনা" - nকিছু পদ্ধতি ব্যবহার করে এগুলি চয়ন করুন (এলোমেলোভাবে, লোভী ইত্যাদি)।
  3. পেঁচানো অনুমান । আপনি একটি গোলকের চারপাশে একটি সর্পিলটি সন্ধান করুন এবং সর্পিলের চারপাশে পয়েন্টগুলি সমানভাবে বিতরণ করুন। জড়িত গণিতের কারণে, এগুলি সিমুলেশনের চেয়ে বোঝা আরও জটিল, তবে অনেক দ্রুত (এবং সম্ভবত কম কোড জড়িত)। স্যাফ, এট আল-এর দ্বারা সর্বাধিক জনপ্রিয় মনে হচ্ছে ।

একটি অনেক এই সমস্যাটি সম্পর্কে আরও তথ্যের খুঁজে পাওয়া যেতে পারে এখানে


আমি নীচে পোস্ট করা এন্ড্রু কুকের সর্পিল কৌশলটি সন্ধান করব, তবে, আপনি কী চান এবং "ইউনিফর্ম এলোমেলো বিতরণ" কোনটির মধ্যে পার্থক্যটি পরিষ্কার করতে পারেন? গোলকটিতে পয়েন্টগুলির কেবলমাত্র 100% এলোমেলোভাবে স্থান নির্ধারণ যাতে তারা অভিন্ন হয়ে যায়? সাহায্যের জন্য ধন্যবাদ. :)
স্পর্শ

4
@ বিফল: "অভিন্ন র্যান্ডম ডিস্ট্রিবিউশন" সম্ভাব্যতা-বিতরণকে অভিন্ন হওয়ার বোঝায় - এর অর্থ, গোলকের উপর একটি এলোমেলো পয়েন্টটি বেছে নেওয়ার সময়, প্রতিটি পয়েন্টটি নির্বাচিত হওয়ার সমান সম্ভাবনা থাকে। পয়েন্টগুলির চূড়ান্ত স্থানিক- বিতরণের সাথে এর কোনও যোগসূত্র নেই এবং এইভাবে আপনার প্রশ্নের সাথে কোনও সম্পর্ক নেই।
নীলরাজ -

আহ, ঠিক আছে, আপনাকে অনেক ধন্যবাদ। আমার প্রশ্নের সন্ধান করা উভয়ের পক্ষে এক টন জবাবের দিকে নিয়ে যায় এবং আমি সত্যিই বুঝতে পারি না যা আমার কাছে অর্থহীন।
7'12

স্পষ্টতই, প্রতিটি পয়েন্টে নির্বাচিত হওয়ার শূন্যতার সম্ভাবনা থাকে। গোলকের তলদেশের যে কোনও দুটি ক্ষেত্রের সাথে পয়েন্টটি সম্পর্কিত সম্ভাবনার অনুপাত, পৃষ্ঠের অনুপাতের সমান।
আতুরস্যামস

2
শেষ লিঙ্কটি এখন মারা গেছে
ফেলিক্স ডি

10

আপনি যা খুঁজছেন তাকে একটি গোলাকার আচ্ছাদন বলা হয় । গোলাকার আচ্ছাদন সমস্যা খুব শক্ত এবং সমাধান সংখ্যক পয়েন্ট বাদে অজানা। একটি জিনিস যা নিশ্চিতভাবে পরিচিত তা হ'ল একটি গোলকের উপর দেওয়া n পয়েন্টগুলি, সর্বদা দুটি পয়েন্টের দূরত্ব d = (4-csc^2(\pi n/6(n-2)))^(1/2)বা কাছাকাছি অবস্থান করে।

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

Random r = new Random();
double[] p = { r.nextGaussian(), r.nextGaussian(), r.nextGaussian() };

তারপরে উত্স থেকে দূরত্বটি স্বাভাবিক করে পয়েন্টটি গোলকের দিকে প্রজেক্ট করুন

double norm = Math.sqrt( (p[0])^2 + (p[1])^2 + (p[2])^2 ); 
double[] sphereRandomPoint = { p[0]/norm, p[1]/norm, p[2]/norm };

এন মাত্রায় গাউসীয় বিতরণটি গোলাকৃতিরভাবে প্রতিসম হয় তাই গোলকের দিকে প্রক্ষেপণটি অভিন্ন।

অবশ্যই, সমানভাবে উত্পন্ন পয়েন্টগুলির সংকলনের যে কোনও দুটি পয়েন্টের মধ্যে দূরত্ব নীচে সীমাবদ্ধ থাকবে তার কোনও গ্যারান্টি নেই, সুতরাং আপনার যে কোনও শর্ত থাকতে পারে তা প্রয়োগ করতে আপনি প্রত্যাখ্যান ব্যবহার করতে পারেন: সম্ভবত পুরো সংগ্রহটি উত্পন্ন করা ভাল এবং তারপরে প্রয়োজনে পুরো সংগ্রহটি প্রত্যাখ্যান করুন। (অথবা আপনি এখন পর্যন্ত যে পুরো সংগ্রহটি তৈরি করেছেন তা প্রত্যাখ্যান করতে "প্রাথমিক প্রত্যাখ্যান" ব্যবহার করুন; কিছু পয়েন্ট রাখবেন না এবং অন্যকে বাদ দিন dbetween) এর মধ্যে ন্যূনতম দূরত্ব নির্ধারণ করতে আপনি উপরের প্রদত্ত সূত্রটি কিছু বিঘ্ন করতে পারেন can নীচে আপনি পয়েন্ট একটি সেট প্রত্যাখ্যান করবে। আপনাকে 2 টি দূরত্ব বেছে নিতে গণনা করতে হবে এবং প্রত্যাখ্যানের সম্ভাবনাটি শিথিলের উপর নির্ভর করবে; কীভাবে বলা যায়, তাই সম্পর্কিত পরিসংখ্যানগুলির অনুভূতি পেতে একটি সিমুলেশন চালান।


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

6

এই উত্তরটি একই 'তত্ত্বের উপর ভিত্তি করে তৈরি করা হয়েছে যা এই উত্তরটির দ্বারা ভালভাবে বর্ণিত হয়েছে

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

20 এ এন এর সাথে:

এখানে চিত্র বর্ণনা লিখুন
এবং তারপরে 80 এ এন: এখানে চিত্র বর্ণনা লিখুন


এখানে প্রস্তুত অজগর 3 কোডটি রয়েছে, যেখানে অনুকরণটি একই উত্স: " http://web.archive.org/web/20120421191837/http://www.cgafaq.info/wiki/Evenly_distributes_points_on_sphere " অন্যদের দ্বারা পাওয়া গেছে । (আমি যে প্লটটি অন্তর্ভুক্ত করেছি, 'প্রধান' হিসাবে চালিত হওয়ার সময় এটি আগুন নেবে: http://www.scipy.org/Cookbook/Matplotlib/mplot3D )

from math import cos, sin, pi, sqrt

def GetPointsEquiAngularlyDistancedOnSphere(numberOfPoints=45):
    """ each point you get will be of form 'x, y, z'; in cartesian coordinates
        eg. the 'l2 distance' from the origion [0., 0., 0.] for each point will be 1.0 
        ------------
        converted from:  http://web.archive.org/web/20120421191837/http://www.cgafaq.info/wiki/Evenly_distributed_points_on_sphere ) 
    """
    dlong = pi*(3.0-sqrt(5.0))  # ~2.39996323 
    dz   =  2.0/numberOfPoints
    long =  0.0
    z    =  1.0 - dz/2.0
    ptsOnSphere =[]
    for k in range( 0, numberOfPoints): 
        r    = sqrt(1.0-z*z)
        ptNew = (cos(long)*r, sin(long)*r, z)
        ptsOnSphere.append( ptNew )
        z    = z - dz
        long = long + dlong
    return ptsOnSphere

if __name__ == '__main__':                
    ptsOnSphere = GetPointsEquiAngularlyDistancedOnSphere( 80)    

    #toggle True/False to print them
    if( True ):    
        for pt in ptsOnSphere:  print( pt)

    #toggle True/False to plot them
    if(True):
        from numpy import *
        import pylab as p
        import mpl_toolkits.mplot3d.axes3d as p3

        fig=p.figure()
        ax = p3.Axes3D(fig)

        x_s=[];y_s=[]; z_s=[]

        for pt in ptsOnSphere:
            x_s.append( pt[0]); y_s.append( pt[1]); z_s.append( pt[2])

        ax.scatter3D( array( x_s), array( y_s), array( z_s) )                
        ax.set_xlabel('X'); ax.set_ylabel('Y'); ax.set_zlabel('Z')
        p.show()
        #end

স্বল্প গণিতে পরীক্ষিত (2 2, 5, 7, 13, এ এন) এবং 'দুর্দান্ত' কাজ করে বলে মনে হচ্ছে


5

চেষ্টা করুন:

function sphere ( N:float,k:int):Vector3 {
    var inc =  Mathf.PI  * (3 - Mathf.Sqrt(5));
    var off = 2 / N;
    var y = k * off - 1 + (off / 2);
    var r = Mathf.Sqrt(1 - y*y);
    var phi = k * inc;
    return Vector3((Mathf.Cos(phi)*r), y, Mathf.Sin(phi)*r); 
};

উপরের ফাংশনটি এন লুপ টোটাল এবং কে লুপের বর্তমান পুনরাবৃত্তির সাহায্যে লুপে চলতে হবে।

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

এখানে একটি চিত্র রয়েছে, আমি ক্যামেরাটি গোলকের অর্ধেক পথের বাইরে রেখেছিলাম তাই এটি 3 ডি এর পরিবর্তে 2 ডি দেখায় কারণ ক্যামেরা সমস্ত পয়েন্ট থেকে সমান দূরত্ব। http://3.bp.blogspot.com/-9lbPHLccQHA/USXf88_bvVI/AAAAAAAAADY/j7qhQsSZsA8/s640/sphere.jpg


2

হেলপিক্স একটি ঘনিষ্ঠভাবে সম্পর্কিত সমস্যা সমাধান করে (সমান অঞ্চল পিক্সেল সহ গোলকটিকে পিক্সেলটিং):

http://healpix.sourceforge.net/

এটি সম্ভবত ওভারকিল, তবে সম্ভবত এটি দেখার পরে আপনি বুঝতে পারবেন এর অন্যান্য কিছু দুর্দান্ত বৈশিষ্ট্য আপনার কাছে আকর্ষণীয়। এটি বিন্যাস মেঘকে আউটপুট করে এমন একটি ক্রিয়াকলাপের চেয়ে আরও বেশি উপায়।

আমি আবার এটি সন্ধান করার চেষ্টা করে এখানে অবতরণ করেছি; "হেলপিক্স" নামটি ঠিক গোলককে উত্সাহিত করে না ...


1

সংখ্যক পয়েন্ট সহ আপনি একটি সিমুলেশন চালাতে পারেন:

from random import random,randint
r = 10
n = 20
best_closest_d = 0
best_points = []
points = [(r,0,0) for i in range(n)]
for simulation in range(10000):
    x = random()*r
    y = random()*r
    z = r-(x**2+y**2)**0.5
    if randint(0,1):
        x = -x
    if randint(0,1):
        y = -y
    if randint(0,1):
        z = -z
    closest_dist = (2*r)**2
    closest_index = None
    for i in range(n):
        for j in range(n):
            if i==j:
                continue
            p1,p2 = points[i],points[j]
            x1,y1,z1 = p1
            x2,y2,z2 = p2
            d = (x1-x2)**2+(y1-y2)**2+(z1-z2)**2
            if d < closest_dist:
                closest_dist = d
                closest_index = i
    if simulation % 100 == 0:
        print simulation,closest_dist
    if closest_dist > best_closest_d:
        best_closest_d = closest_dist
        best_points = points[:]
    points[closest_index]=(x,y,z)


print best_points
>>> best_points
[(9.921692138442777, -9.930808529773849, 4.037839326088124),
 (5.141893371460546, 1.7274947332807744, -4.575674650522637),
 (-4.917695758662436, -1.090127967097737, -4.9629263893193745),
 (3.6164803265540666, 7.004158551438312, -2.1172868271109184),
 (-9.550655088997003, -9.580386054762917, 3.5277052594769422),
 (-0.062238110294250415, 6.803105171979587, 3.1966101417463655),
 (-9.600996012203195, 9.488067284474834, -3.498242301168819),
 (-8.601522086624803, 4.519484132245867, -0.2834204048792728),
 (-1.1198210500791472, -2.2916581379035694, 7.44937337008726),
 (7.981831370440529, 8.539378431788634, 1.6889099589074377),
 (0.513546008372332, -2.974333486904779, -6.981657873262494),
 (-4.13615438946178, -6.707488383678717, 2.1197605651446807),
 (2.2859494919024326, -8.14336582650039, 1.5418694699275672),
 (-7.241410895247996, 9.907335206038226, 2.271647103735541),
 (-9.433349952523232, -7.999106443463781, -2.3682575660694347),
 (3.704772125650199, 1.0526567864085812, 6.148581714099761),
 (-3.5710511242327048, 5.512552040316693, -3.4318468250897647),
 (-7.483466337225052, -1.506434920354559, 2.36641535124918),
 (7.73363824231576, -8.460241422163824, -1.4623228616326003),
 (10, 0, 0)]

আমার উত্তরটির উন্নতি করতে আপনার নিকটতম_আইডেক্স = আমি নিকটতম_ইন্ডেক্স = র‌্যাণ্ডচয়েস (আই, জে) পরিবর্তন করা উচিত
রবার্ট রাজা

1

আপনার দুটি বৃহত্তম কারণকে নিন N, যদি N==20তবে দুটি বৃহত্তম কারণ হয় {5,4}বা আরও সাধারণভাবে {a,b}। হিসাব

dlat  = 180/(a+1)
dlong = 360/(b+1})

আপনার প্রথম বিন্দু রাখুন {90-dlat/2,(dlong/2)-180}এ আপনার দ্বিতীয় {90-dlat/2,(3*dlong/2)-180}, আপনার 3 য় {90-dlat/2,(5*dlong/2)-180}পর্যন্ত আপনি বিশ্বের একবার, যা সময় দ্বারা আপনার সম্পর্কে পেয়েছেন বৃত্তাকার হোঁচট খেয়েছি থাকেন {75,150}যখন আপনি পাশে যেতে {90-3*dlat/2,(dlong/2)-180}

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

কিছুটা এলোমেলো যোগ করার জন্য, আপনি সাধারণত 2-টি বিতরণ (যথাযথ হিসাবে 0 এবং std দেব {dlat / 3, dlong / 3 appropriate) যথাযথভাবে উত্পন্ন করতে এবং এগুলিকে আপনার অভিন্ন বিতরণকারী পয়েন্টগুলিতে যুক্ত করতে পারেন।


5
যদি আপনি লাতরের চেয়ে পাপ (ল্যাট) এ কাজ করে থাকেন তবে এটি অনেক ভাল দেখাচ্ছে। যেমনটি হ'ল, আপনি খুঁটির কাছে প্রচুর গোছা পাবেন।
অ্যান্ড্রু কোক

1

সম্পাদনা করুন: ওপি জিজ্ঞাসা করা প্রশ্নটির উত্তর দেয় না, লোকেরা যদি কোনও উপকারে আসে তবে এটি এখানে রেখে দেয়।

আমরা সম্ভাবনার গুনের নিয়ম ব্যবহার করি, অসীমের সাথে মিলিত। এটি আপনার পছন্দসই ফলাফলটি অর্জনের জন্য 2 টি লাইন কোডে ফলাফল:

longitude: φ = uniform([0,2pi))
azimuth:   θ = -arcsin(1 - 2*uniform([0,1]))

(নিম্নলিখিত সমন্বয় সিস্টেমে সংজ্ঞায়িত :)

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

আপনার ভাষায় সাধারণত অভিন্ন র্যান্ডম সংখ্যা আদিম থাকে। অজগর উদাহরণস্বরূপ আপনি random.random()পরিসীমা একটি নম্বর ফিরে ব্যবহার করতে পারেন [0,1)। পরিসরে একটি এলোমেলো নম্বর পেতে আপনি এই সংখ্যাটি কে দিয়ে গুণতে পারেন [0,k)। সুতরাং অজগর, uniform([0,2pi))মানে হবে random.random()*2*math.pi


প্রমাণ

এখন আমরা অভিন্নভাবে বরাদ্দ করতে পারি না, অন্যথায় আমরা খুঁটিগুলিতে ক্লাম্পিং করব। আমরা স্ফিয়ারিকাল ওয়েজ পৃষ্ঠের ক্ষেত্রফলের সাথে সমানুপাতিক সম্ভাবনাগুলি অর্পণ করতে চাই (এই চিত্রটিতে actually আসলে is):

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

নিরক্ষীয় অঞ্চলে একটি কৌণিক স্থানচ্যুতি dφ এর ফলে dφ * r এর স্থানচ্যুতি ঘটে। সেই স্থানচ্যুতিটি একটি নির্বিচারে আজিমুতে কী হবে? ঠিক আছে, জেড-অক্ষ থেকে ব্যাসার্ধটি r*sin(θ)তাই wed ছেদকে ছেদ করা সেই "অক্ষাংশ" এর কৃত্রিমতা dφ * r*sin(θ)। সুতরাং আমরা দক্ষিণ মেরু থেকে উত্তর মেরুতে স্লাইসের ক্ষেত্রটি একীভূত করে এর থেকে নমুনার জন্য অঞ্চলটির संचयी বন্টন গণনা করি ।

এখানে চিত্র বর্ণনা লিখুন(যেখানে স্টাফ = dφ*r)

আমরা এখন থেকে এটি থেকে নমুনা পেতে সিডিএফের বিপরীতমুখী পেতে চেষ্টা করব: http://en.wikedia.org/wiki/Inverse_transfor_sampling

প্রথমে আমরা আমাদের প্রায়-সিডিএফকে তার সর্বোচ্চ মান দিয়ে ভাগ করে স্বাভাবিক করি। এর সাথে ডি এবং আর কে বাতিল করার পার্শ্ব-প্রতিক্রিয়া রয়েছে।

azimuthalCDF: cumProb = (sin(θ)+1)/2 from -pi/2 to pi/2

inverseCDF: θ = -sin^(-1)(1 - 2*cumProb)

এভাবে:

let x by a random float in range [0,1]
θ = -arcsin(1-2*x)

এই বিকল্পটি তিনি "100% র্যান্ডমাইজড" হিসাবে ফেলে দেওয়া বিকল্পের সমান নয়? আমার বোধগম্যতা হল তিনি চান যে তারা একটি অভিন্ন র্যান্ডম বিতরণের চেয়ে আরও সমানভাবে ব্যবধানে থাকতে পারে।
অ্যান্ড্রু কুঁচকে

@ ব্লুরাজা-ড্যানিপ্লুঘুফুট: হুম, যথেষ্ট ন্যায্য। আমি অনুমান করি যে প্রশ্নটি আমার উচিত ঠিক তেমন যত্ন সহকারে পড়িনি। অন্যরা যদি এটির কাজে লাগে সে ক্ষেত্রে আমি এটিকে এখানে রেখে দিই। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ.
নিনজেকেকো

1

বা ... 20 পয়েন্ট রাখতে আইকোসহেড্রোনাল মুখগুলির কেন্দ্রগুলি গণনা করুন। 12 পয়েন্টের জন্য, আইকোসহেড্রনের শীর্ষগুলি সন্ধান করুন। 30 পয়েন্টের জন্য, আইকোশেড্রনের প্রান্তগুলির মধ্য পয়েন্ট। আপনি একই জিনিসটি টেটারহেড্রন, কিউব, ডডেকাহেড্রন এবং অষ্টাহেদরনগুলির সাহায্যে করতে পারেন: পয়েন্টগুলির একটি সেটটি শীর্ষে অবস্থিত, অন্যটির মুখের কেন্দ্রে এবং অন্য প্রান্তের কেন্দ্রে। সেগুলি অবশ্য মিশ্রিত হতে পারে না।


একটি ভাল ধারণা, তবে এটি কেবল 4, 6, 8, 12, 20, 24 বা 30 পয়েন্টের জন্য কাজ করে।
দ্য হাট

আপনি যদি প্রতারণা করতে চান তবে আপনি মুখ এবং উল্লম্বের কেন্দ্রটি ব্যবহার করতে পারেন। এগুলি সমতুল্য নয় বরং একটি শালীন অনুমানের হবে। এটি দুর্দান্ত কারণ এটি নির্বিচারক।
chessofnerd

0
# create uniform spiral grid
numOfPoints = varargin[0]
vxyz = zeros((numOfPoints,3),dtype=float)
sq0 = 0.00033333333**2
sq2 = 0.9999998**2
sumsq = 2*sq0 + sq2
vxyz[numOfPoints -1] = array([(sqrt(sq0/sumsq)), 
                              (sqrt(sq0/sumsq)), 
                              (-sqrt(sq2/sumsq))])
vxyz[0] = -vxyz[numOfPoints -1] 
phi2 = sqrt(5)*0.5 + 2.5
rootCnt = sqrt(numOfPoints)
prevLongitude = 0
for index in arange(1, (numOfPoints -1), 1, dtype=float):
  zInc = (2*index)/(numOfPoints) -1
  radius = sqrt(1-zInc**2)

  longitude = phi2/(rootCnt*radius)
  longitude = longitude + prevLongitude
  while (longitude > 2*pi): 
    longitude = longitude - 2*pi

  prevLongitude = longitude
  if (longitude > pi):
    longitude = longitude - 2*pi

  latitude = arccos(zInc) - pi/2
  vxyz[index] = array([ (cos(latitude) * cos(longitude)) ,
                        (cos(latitude) * sin(longitude)), 
                        sin(latitude)])

4
এটি সহায়ক হবে যদি আপনি কিছু পাঠ্য লিখেন যা এটি বোঝাতে চেয়েছিল, সুতরাং ওপিকে বিশ্বাসের সাথে নিতে হবে না যে এটি কেবল কাজ করবে।
hcarver

0

@ আরবার্ট কিং এটি সত্যিই দুর্দান্ত সমাধান তবে এতে কিছু ঝাপটে বাগ রয়েছে। আমি জানি এটি যদিও আমাকে অনেক সাহায্য করেছে তাই theালুতা মনে করবেন না। :) এখানে একটি পরিষ্কার সংস্করণ দেওয়া আছে ....

from math import pi, asin, sin, degrees
halfpi, twopi = .5 * pi, 2 * pi
sphere_area = lambda R=1.0: 4 * pi * R ** 2

lat_dist = lambda lat, R=1.0: R*(1-sin(lat))

#A = 2*pi*R^2(1-sin(lat))
def sphere_latarea(lat, R=1.0):
    if -halfpi > lat or lat > halfpi:
        raise ValueError("lat must be between -halfpi and halfpi")
    return 2 * pi * R ** 2 * (1-sin(lat))

sphere_lonarea = lambda lon, R=1.0: \
        4 * pi * R ** 2 * lon / twopi

#A = 2*pi*R^2 |sin(lat1)-sin(lat2)| |lon1-lon2|/360
#    = (pi/180)R^2 |sin(lat1)-sin(lat2)| |lon1-lon2|
sphere_rectarea = lambda lat0, lat1, lon0, lon1, R=1.0: \
        (sphere_latarea(lat0, R)-sphere_latarea(lat1, R)) * (lon1-lon0) / twopi


def test_sphere(n_lats=10, n_lons=19, radius=540.0):
    total_area = 0.0
    for i_lons in range(n_lons):
        lon0 = twopi * float(i_lons) / n_lons
        lon1 = twopi * float(i_lons+1) / n_lons
        for i_lats in range(n_lats):
            lat0 = asin(2 * float(i_lats) / n_lats - 1)
            lat1 = asin(2 * float(i_lats+1)/n_lats - 1)
            area = sphere_rectarea(lat0, lat1, lon0, lon1, radius)
            print("{:} {:}: {:9.4f} to  {:9.4f}, {:9.4f} to  {:9.4f} => area {:10.4f}"
                    .format(i_lats, i_lons
                    , degrees(lat0), degrees(lat1)
                    , degrees(lon0), degrees(lon1)
                    , area))
            total_area += area
    print("total_area = {:10.4f} (difference of {:10.4f})"
            .format(total_area, abs(total_area) - sphere_area(radius)))

test_sphere()

-1

এটি কাজ করে এবং এটি মারাত্মক সহজ। আপনি চান যতগুলি পয়েন্ট:

    private function moveTweets():void {


        var newScale:Number=Scale(meshes.length,50,500,6,2);
        trace("new scale:"+newScale);


        var l:Number=this.meshes.length;
        var tweetMeshInstance:TweetMesh;
        var destx:Number;
        var desty:Number;
        var destz:Number;
        for (var i:Number=0;i<this.meshes.length;i++){

            tweetMeshInstance=meshes[i];

            var phi:Number = Math.acos( -1 + ( 2 * i ) / l );
            var theta:Number = Math.sqrt( l * Math.PI ) * phi;

            tweetMeshInstance.origX = (sphereRadius+5) * Math.cos( theta ) * Math.sin( phi );
            tweetMeshInstance.origY= (sphereRadius+5) * Math.sin( theta ) * Math.sin( phi );
            tweetMeshInstance.origZ = (sphereRadius+5) * Math.cos( phi );

            destx=sphereRadius * Math.cos( theta ) * Math.sin( phi );
            desty=sphereRadius * Math.sin( theta ) * Math.sin( phi );
            destz=sphereRadius * Math.cos( phi );

            tweetMeshInstance.lookAt(new Vector3D());


            TweenMax.to(tweetMeshInstance, 1, {scaleX:newScale,scaleY:newScale,x:destx,y:desty,z:destz,onUpdate:onLookAtTween, onUpdateParams:[tweetMeshInstance]});

        }

    }
    private function onLookAtTween(theMesh:TweetMesh):void {
        theMesh.lookAt(new Vector3D());
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.