কনট্যুর মানচিত্রে বহুভুজ স্মুথ করছেন?


52

এখানে একটি কনট্যুর মানচিত্র রয়েছে যার জন্য স্তরের সমস্ত বহুভুজ উপলব্ধ।

আসুন জিজ্ঞাসা করুন কীভাবে বহুভুজগুলি তাদের যথাযথ স্থানে সংরক্ষিত রাখে?

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

আসলে আমি একটি কোডের টুকরো খুঁজছি (সাধারণত পাইথনের মধ্যে ) যা 2D বহুভুজ (যে কোনও প্রকার: উত্তল, অবতল, স্ব-ছেদ করা ইত্যাদি) এর যুক্তিসঙ্গত বেদনাদায়ক (কোডগুলির পৃষ্ঠাগুলি ভুলে যাওয়া) এবং নির্ভুল করতে পারে do

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

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


1)

Scipy.interpolate:

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

আপনি দেখতে পাচ্ছেন ফলস্বরূপ স্প্লাইনগুলি (লাল) সন্তোষজনক নয়!

2)

এখানে দেওয়া কোড ব্যবহার ফল এখানে । এটা ভাল কাজ করছে না!

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

3)

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

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

স্প্লাইনটি পয়েন্টগুলি পাস করে এমন শর্তটি সন্তুষ্ট করে:

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

4)

তার ডেটাগুলিতে পাইথনের লাইনে আমার "হোবার্সের ধারণা" লাইনটি প্রয়োগ করা এখানে । ফলাফলগুলি ভাল না হওয়ায় সম্ভবত কিছু বাগ রয়েছে।

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

কে = 2 একটি বিপর্যয় এবং তাই কে> = 4 এর জন্য।

5)

আমি সমস্যাযুক্ত স্থানে একটি পয়েন্ট সরিয়েছি এবং ফলস্বরূপ স্প্লাইনটি এখন হোবারগুলির মতো। তবে এটি এখনও একটি প্রশ্ন যে পদ্ধতিটি কেন সব ক্ষেত্রে কাজ করে না?

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

6)

নীচে (ভেক্টর গ্রাফিক্স সফ্টওয়্যার দ্বারা আঁকা) ভুবার তথ্যের জন্য একটি ভাল স্মুথিং হতে পারে যাতে একটি অতিরিক্ত পয়েন্ট সহজেই যুক্ত করা হয়েছে (আপডেটের সাথে তুলনা করুন)

4):

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

7)

কিছু আইকনিক আকারের জন্য হোবার কোডের পাইথন সংস্করণ থেকে ফলাফলটি দেখুন:

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

8) [আমার শেষ]

এখানে চূড়ান্ত সমাধান (নিখুঁত নয়!):

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

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


কীভাবে আপনি 'বহুভুজ' রূপগুলি তৈরি করছেন? এগুলি কি সর্বদা লাইন হয় না, যেহেতু কোনও ডিইএমের প্রান্তকে ছেদ করে এমন একটি কনট্যুর কখনই নিজেকে বন্ধ করে দেয় না?
পেস্তা

আমি শালীন ফলাফলের সাথে কনট্যুর লাইনগুলি মসৃণ করতে গ্রাসে v.generalize ফাংশনটি ব্যবহার করেছি, যদিও এটি খুব ঘন পৃষ্ঠগুলির সাথে মানচিত্রের জন্য কিছুটা সময় নিতে পারে।
পেস্তা

@ পিস্তানাওত আপনি কনট্যুর স্তরগুলি বহু-লাইন হিসাবে বিবেচনা করতে পারেন। আমি প্রথম পর্যায়ে খাঁটি কোড খুঁজছি । যদি পাওয়া না যায় তবে পাইথনের জন্য হালকা প্যাকেজ।
বিকাশকারী

সম্ভবত scipy.org/Cookbook/Interpolation দেখুন কারণ মনে হচ্ছে আপনি স্প্লিন করতে চান
পলিজিও

1
আপনার লিঙ্কে পাবলো বেজিয়ার বক্ররেখার পোলাইনের পক্ষে ভাল কাজ করে। বহুবিধ জন্য whuber এর কাজ প্রায় ভাল। সুতরাং তারা একসাথে প্রশ্নটির সমাধান করতে পারে। বিনামূল্যে আপনার জ্ঞান ভাগ করে নেওয়ার জন্য অনেক ধন্যবাদ।
বিকাশকারী

উত্তর:


37

সংখ্যাগুলির ক্রমগুলি ভাঙার বেশিরভাগ পদ্ধতিগুলি বহুভুজকে স্প্লিন করবে। কৌশলটি শেষ পয়েন্টগুলিতে স্প্লাইজগুলি "ক্লোজ আপ" সাবলীলভাবে তৈরি করা। এটি করার জন্য, প্রান্তগুলি প্রায় শিখুন "মোড়ানো"। তারপরে x- এবং y- স্থানাঙ্কগুলি পৃথকভাবে স্প্লিন করুন।

এখানে একটি কার্যকারী উদাহরণ R। এটি splineমৌলিক পরিসংখ্যান প্যাকেজে উপলব্ধ ডিফল্ট কিউবিক পদ্ধতি ব্যবহার করে । আরো নিয়ন্ত্রণের জন্য, বদলি প্রায় কোনো পদ্ধতি আপনি পছন্দ: শুধু নিশ্চিত করুন যে এটি splines করা মাধ্যমে সংখ্যা (যে তাদের interpolates) বদলে নিছক তাদের হিসেবে ব্যবহার "নিয়ন্ত্রণ পয়েন্ট।"

#
# Splining a polygon.
#
#   The rows of 'xy' give coordinates of the boundary vertices, in order.
#   'vertices' is the number of spline vertices to create.
#              (Not all are used: some are clipped from the ends.)
#   'k' is the number of points to wrap around the ends to obtain
#       a smooth periodic spline.
#
#   Returns an array of points. 
# 
spline.poly <- function(xy, vertices, k=3, ...) {
    # Assert: xy is an n by 2 matrix with n >= k.

    # Wrap k vertices around each end.
    n <- dim(xy)[1]
    if (k >= 1) {
        data <- rbind(xy[(n-k+1):n,], xy, xy[1:k, ])
    } else {
        data <- xy
    }

    # Spline the x and y coordinates.
    data.spline <- spline(1:(n+2*k), data[,1], n=vertices, ...)
    x <- data.spline$x
    x1 <- data.spline$y
    x2 <- spline(1:(n+2*k), data[,2], n=vertices, ...)$y

    # Retain only the middle part.
    cbind(x1, x2)[k < x & x <= n+k, ]
}

এর ব্যবহার চিত্রিত করার জন্য, আসুন একটি ছোট (তবে জটিল) বহুভুজ তৈরি করি।

#
# Example polygon, randomly generated.
#
set.seed(17)
n.vertices <- 10
theta <- (runif(n.vertices) + 1:n.vertices - 1) * 2 * pi / n.vertices
r <- rgamma(n.vertices, shape=3)
xy <- cbind(cos(theta) * r, sin(theta) * r)

পূর্ববর্তী কোড ব্যবহার করে এটি স্প্লিন করুন। স্প্লাইনটি মসৃণ করতে, শীর্ষ থেকে সংখ্যা 100 থেকে বাড়ান; এটি কম মসৃণ করতে, শীর্ষে সংখ্যা হ্রাস করুন।

s <- spline.poly(xy, 100, k=3)

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

plot(s, type="l", lwd=2, col="Gray")
lines(xy, col="Red", lty=2, lwd=2)
points(xy, col="Red", pch=19)
points(s, cex=0.8)
points(s[c(1,dim(s)[1]),], col="Blue", pch=19)

স্প্লিং বহুভুজ


5
চমৎকার উত্তর. স্বাচ্ছন্দ্যের ফলে কনট্যুরগুলি শেষ হওয়ার কোনও উপায় নেই?
কर्क কুইকেনডাল

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

প্রথমত, আমি এখনও পাইথনে আপনার উত্তর বাস্তবায়নের জন্য কাজ করছি, তবুও সফল হই নি। দ্বিতীয়ত, আপনি যদি কোনও স্কোয়ারে আপনার পদ্ধতি প্রয়োগ করেন তবে ফলাফল কী হবে? আপনি প্রশ্নে আঁকেন আপনি তাদের উল্লেখ করতে পারেন।
বিকাশকারী

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

1
আপনার উত্তরগুলি দেখে, আমি আমার গণিতের ভালভাবে যত্ন না নেওয়ার জন্য আফসোস করছি !!!
বিনয়ন

2

আমি জানি এটি একটি পুরানো পোস্ট, তবে এটি আমি যা খুঁজছিলাম তার জন্য এটি গুগলে প্রদর্শিত হয়েছিল, তাই আমি ভেবেছিলাম যে আমি আমার সমাধান পোস্ট করব।

আমি এটি 2 ডি বক্ররেখার ফিটিং অনুশীলন হিসাবে দেখছি না, বরং একটি 3D টি। ডেটা 3 ডি হিসাবে বিবেচনা করে আমরা নিশ্চিত করতে পারি যে বক্ররেখা কখনই একে অপরকে অতিক্রম করতে পারে না এবং বর্তমানের জন্য আমাদের অনুমানের উন্নতি করতে অন্য রূপগুলি থেকে তথ্য ব্যবহার করতে পারি।

নিম্নলিখিত আইপিথন এক্সট্র্যাক্টটিতে সায়পি দ্বারা প্রদত্ত কিউবিক ইন্টারপোলেশন ব্যবহার করা হয়েছে। মনে রাখবেন যে z মানগুলি আমি প্লট করেছি সেগুলি গুরুত্বপূর্ণ নয় যতক্ষণ না সমস্ত আকারগুলি উচ্চতার সমান হয়।

In [1]: %pylab inline
        pylab.rcParams['figure.figsize'] = (10, 10)
        Populating the interactive namespace from numpy and matplotlib

In [2]: import scipy.interpolate as si

        xs = np.array([0.0, 0.0, 4.5, 4.5,
                       0.3, 1.5, 2.3, 3.8, 3.7, 2.3,
                       1.5, 2.2, 2.8, 2.2,
                       2.1, 2.2, 2.3])
        ys = np.array([0.0, 3.0, 3.0, 0.0,
                       1.1, 2.3, 2.5, 2.3, 1.1, 0.5,
                       1.1, 2.1, 1.1, 0.8,
                       1.1, 1.3, 1.1])
        zs = np.array([0,   0,   0,   0,
                       1,   1,   1,   1,   1,   1,
                       2,   2,   2,   2,
                       3,   3,   3])
        pts = np.array([xs, ys]).transpose()

        # set up a grid for us to resample onto
        nx, ny = (100, 100)
        xrange = np.linspace(np.min(xs[zs!=0])-0.1, np.max(xs[zs!=0])+0.1, nx)
        yrange = np.linspace(np.min(ys[zs!=0])-0.1, np.max(ys[zs!=0])+0.1, ny)
        xv, yv = np.meshgrid(xrange, yrange)
        ptv = np.array([xv, yv]).transpose()

        # interpolate over the grid
        out = si.griddata(pts, zs, ptv, method='cubic').transpose()

        def close(vals):
            return np.concatenate((vals, [vals[0]]))

        # plot the results
        levels = [1, 2, 3]
        plt.plot(close(xs[zs==1]), close(ys[zs==1]))
        plt.plot(close(xs[zs==2]), close(ys[zs==2]))
        plt.plot(close(xs[zs==3]), close(ys[zs==3]))
        plt.contour(xrange, yrange, out, levels)
        plt.show()

কিউবিক ইন্টারপোলটেড ফলাফল

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


লাগানো মসৃণ বক্ররেখাগুলি মূল বহুভুজ / বহুলম্বের কাছে যতটা সম্ভব বন্ধ থাকা উচিত stay
বিকাশকারী

1

আপনি যে প্যাকেজটি সন্ধান করছেন আমি প্রায় ঠিক লিখেছিলাম ... তবে এটি পার্লে ছিল এবং এক দশক আগে এটি ছিল: জিডি :: পললাইন । এটি 2 ডি কিউবিক বেজিয়ার কার্ভ ব্যবহার করত এবং এটি একটি নির্বিচারে বহুভুজ বা "পলিনলাইন" (আমার নামটি যা এখন সাধারণত "লাইনস্ট্রিং" নামে পরিচিত) এর জন্য তৈরি করত।

অ্যালগরিদমটি দুটি ধাপ ছিল: বহুভুতে পয়েন্টগুলি দেওয়া হলে প্রতিটি পয়েন্টের মধ্যে দুটি বেজিয়ার নিয়ন্ত্রণ পয়েন্ট যুক্ত করুন; তারপরে স্প্লাইনের একটি টুকরোচক সংলগ্ন করতে একটি সাধারণ অ্যালগরিদম কল করুন।

দ্বিতীয় অংশটি সহজ; প্রথম অংশটি কিছুটা শিল্প ছিল। অন্তর্দৃষ্টিটি এখানে ছিল: একটি "নিয়ন্ত্রণ বিভাগ" একটি ভার্টেক্স এন: বিবেচনা করুন vN। নিয়ন্ত্রণ সেগমেন্ট তিনটি সহ-রৈখিক পয়েন্ট ছিল: [cNa, vN, cNb]। কেন্দ্র পয়েন্ট ছিল শীর্ষবিন্দু। এই নিয়ন্ত্রণ সেগের opeাল ভার্টেক্স এন -1 থেকে ভার্টেক্স এন + 1 এর opeালের সমান ছিল। এই বিভাগের বাম অংশের দৈর্ঘ্যটি ভার্টেক্স এন -1 থেকে ভার্টেক্স এন থেকে দৈর্ঘ্য 1/3 এবং এই বিভাগের ডান অংশটির দৈর্ঘ্য ভার্টেক্স এন থেকে ভার্টেক্স এন + 1 এর দৈর্ঘ্য 1/3 ছিল।

মূল বক্ররেখা চার ছেদচিহ্ন হয়: [v1, v2, v3, v4]তারপর The প্রতিটি প্রান্তবিন্দু এখন ফর্মের একটি নিয়ন্ত্রণ সেগমেন্ট পাবেন: [c2a, v2, c2b]। এগুলি একসাথে স্ট্রিং করুন: [v1, c1b, c2a, v2, c2b, c3a, v3, c3b, c4a, v4]এবং চারটি বেজিয়ার পয়েন্ট হিসাবে একবারে সেগুলি চারটি বানান: [v1, c1b, c2a, v2]তারপরে [v2, c2b, c3a, v3], এবং আরও কিছু। যেহেতু [c2a, v2, c2b]সহ-লিনিয়ার ছিল, ফলস্বরূপ বক্ররেখা প্রতিটি প্রান্তে মসৃণ হবে।

সুতরাং এটি আপনার বক্ররেখার "দৃ tight়তা" প্যারামিটারাইজ করার জন্য প্রয়োজনীয়তাও মেটায়: "কড়াকড়ি" বক্ররেখার জন্য 1/3 এর চেয়ে কম মান ব্যবহার করুন, "লুপিয়ার" ফিটের জন্য আরও বড়। উভয় ক্ষেত্রেই, ফলস্বরূপ বক্ররেখা সর্বদা মূল প্রদত্ত পয়েন্টগুলির মধ্য দিয়ে যায়।

এটি একটি মসৃণ বক্ররেখার ফলে আসল বহুভুজকে "সংক্ষিপ্ত" করে। একটি মসৃণ বক্ররেখার "শিলালিপি" দেওয়ারও আমার কিছু উপায় ছিল ... তবে আমি সিপিএএন কোডটিতে এটি দেখতে পাচ্ছি না।

যাইহোক, এই মুহুর্তে পাইথনে আমার কাছে কোনও সংস্করণ নেই, না আমার কোনও চিত্র নেই। তবে ... যদি / আমি পাইথনের কাছে পোর্ট করি তবে আমি এখানে অবশ্যই পোস্ট করব।


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