উটাহ টিপট আঁকুন


20

উটাহ চা তৈয়ারি করার পাত্র , মূলত মার্টিন নিউওয়েল দ্বারা নির্মিত, টেস্টিং 3D গ্রাফিক্স প্রোগ্রামের জন্য একটি সুবিধাজনক অবজেক্ট।

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

ওয়্যারফ্রেম চাঘিটি

সুত্র। স্ট্যাকওভারফ্লো: বেটায়ার প্যাচগুলি উটাহ টিপোটে কীভাবে কাজ করবে?

সুতরাং এখানে তিনটি সাব-টাস্ক রয়েছে:

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

ধরে নিই যে কোনও ফাইল থেকে লাইন-ওরিয়েন্টেড টেক্সট ডেটা পড়া কিছুটা সমস্যা, এই চ্যালেঞ্জটি দ্বি-কিউবিক বেজিয়ার প্যাচ ডেটা হাতে পাওয়ার বিষয়ে সত্যই ।

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

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

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


আমি কি আমার গণনায় বিন্যাসের অ্যারের গণনাটি অন্তর্ভুক্ত করব?
TheDoctor

আমি বরং এটি কোনও ফাইল থেকে দেখছি, ... তবে না, প্যাচ ডেটা আসার পরেও এটি গণনা করার দরকার নেই।
লুসার droog

আমি বিল্টইনগুলি glutSolidTeapotএবং এরglutWireTeapot মতো বর্জন করার পরামর্শ দেব !
অ্যান্ডারস কাসরগ

@ আন্ডারস ক্যাসরগ আমি মনে করি যে আমি মূল তথ্যটি পড়ার দরকার পড়ে coveredেকে রেখেছি। ... যে বলেছিল, আমি এই বিধি প্রয়োগ করতে শিথিল হয়েছি । আরও ঘনিষ্ঠভাবে বৈধ উত্তর সহজেই চেকমার্কটি গ্রহণ করবে, এমনকি এটি দীর্ঘ হলেও।
লুসার droog

@ লেজারড্রোগ এমন একটি সমাধানের কল্পনা করুন যা মূল ডেটা পড়ে, এড়িয়ে যায় এবং কল করে glutWireTeapot
অ্যান্ডার্স কাসেরগ

উত্তর:


9

প্রক্রিয়াজাতকরণ (জাভা), 314 (237 ক্যামেরা নিয়ন্ত্রণ ছাড়াই)

অ্যারে সংজ্ঞা সহ নয়:

void setup(){size(640,480,P3D);}void draw(){background(0);noFill();stroke(255);translate(width/2,height/2,70);scale(30);rotateX(map(mouseX,0,width,0,TWO_PI));rotateY(map(mouseY,0,height,0,TWO_PI));for(int[] p:patches){beginShape();for(int pt:p){vertex(data[pt-1][0],data[pt-1][1],data[pt-1][2]);}endShape(CLOSE);}}

ডেটা অ্যারে সংজ্ঞা:

float [][] data = {{1.4,0.0,2.4},
{1.4,-0.784,2.4},
{0.784,-1.4,2.4},
{0.0,-1.4,2.4},
{1.3375,0.0,2.53125},
{1.3375,-0.749,2.53125},
{0.749,-1.3375,2.53125},
{0.0,-1.3375,2.53125},
{1.4375,0.0,2.53125},
{1.4375,-0.805,2.53125},
{0.805,-1.4375,2.53125},
{0.0,-1.4375,2.53125},
{1.5,0.0,2.4},
{1.5,-0.84,2.4},
{0.84,-1.5,2.4},
{0.0,-1.5,2.4},
{-0.784,-1.4,2.4},
{-1.4,-0.784,2.4},
{-1.4,0.0,2.4},
{-0.749,-1.3375,2.53125},
{-1.3375,-0.749,2.53125},
{-1.3375,0.0,2.53125},
{-0.805,-1.4375,2.53125},
{-1.4375,-0.805,2.53125},
{-1.4375,0.0,2.53125},
{-0.84,-1.5,2.4},
{-1.5,-0.84,2.4},
{-1.5,0.0,2.4},
{-1.4,0.784,2.4},
{-0.784,1.4,2.4},
{0.0,1.4,2.4},
{-1.3375,0.749,2.53125},
{-0.749,1.3375,2.53125},
{0.0,1.3375,2.53125},
{-1.4375,0.805,2.53125},
{-0.805,1.4375,2.53125},
{0.0,1.4375,2.53125},
{-1.5,0.84,2.4},
{-0.84,1.5,2.4},
{0.0,1.5,2.4},
{0.784,1.4,2.4},
{1.4,0.784,2.4},
{0.749,1.3375,2.53125},
{1.3375,0.749,2.53125},
{0.805,1.4375,2.53125},
{1.4375,0.805,2.53125},
{0.84,1.5,2.4},
{1.5,0.84,2.4},
{1.75,0.0,1.875},
{1.75,-0.98,1.875},
{0.98,-1.75,1.875},
{0.0,-1.75,1.875},
{2.0,0.0,1.35},
{2.0,-1.12,1.35},
{1.12,-2.0,1.35},
{0.0,-2.0,1.35},
{2.0,0.0,0.9},
{2.0,-1.12,0.9},
{1.12,-2.0,0.9},
{0.0,-2.0,0.9},
{-0.98,-1.75,1.875},
{-1.75,-0.98,1.875},
{-1.75,0.0,1.875},
{-1.12,-2.0,1.35},
{-2.0,-1.12,1.35},
{-2.0,0.0,1.35},
{-1.12,-2.0,0.9},
{-2.0,-1.12,0.9},
{-2.0,0.0,0.9},
{-1.75,0.98,1.875},
{-0.98,1.75,1.875},
{0.0,1.75,1.875},
{-2.0,1.12,1.35},
{-1.12,2.0,1.35},
{0.0,2.0,1.35},
{-2.0,1.12,0.9},
{-1.12,2.0,0.9},
{0.0,2.0,0.9},
{0.98,1.75,1.875},
{1.75,0.98,1.875},
{1.12,2.0,1.35},
{2.0,1.12,1.35},
{1.12,2.0,0.9},
{2.0,1.12,0.9},
{2.0,0.0,0.45},
{2.0,-1.12,0.45},
{1.12,-2.0,0.45},
{0.0,-2.0,0.45},
{1.5,0.0,0.225},
{1.5,-0.84,0.225},
{0.84,-1.5,0.225},
{0.0,-1.5,0.225},
{1.5,0.0,0.15},
{1.5,-0.84,0.15},
{0.84,-1.5,0.15},
{0.0,-1.5,0.15},
{-1.12,-2.0,0.45},
{-2.0,-1.12,0.45},
{-2.0,0.0,0.45},
{-0.84,-1.5,0.225},
{-1.5,-0.84,0.225},
{-1.5,0.0,0.225},
{-0.84,-1.5,0.15},
{-1.5,-0.84,0.15},
{-1.5,0.0,0.15},
{-2.0,1.12,0.45},
{-1.12,2.0,0.45},
{0.0,2.0,0.45},
{-1.5,0.84,0.225},
{-0.84,1.5,0.225},
{0.0,1.5,0.225},
{-1.5,0.84,0.15},
{-0.84,1.5,0.15},
{0.0,1.5,0.15},
{1.12,2.0,0.45},
{2.0,1.12,0.45},
{0.84,1.5,0.225},
{1.5,0.84,0.225},
{0.84,1.5,0.15},
{1.5,0.84,0.15},
{-1.6,0.0,2.025},
{-1.6,-0.3,2.025},
{-1.5,-0.3,2.25},
{-1.5,0.0,2.25},
{-2.3,0.0,2.025},
{-2.3,-0.3,2.025},
{-2.5,-0.3,2.25},
{-2.5,0.0,2.25},
{-2.7,0.0,2.025},
{-2.7,-0.3,2.025},
{-3.0,-0.3,2.25},
{-3.0,0.0,2.25},
{-2.7,0.0,1.8},
{-2.7,-0.3,1.8},
{-3.0,-0.3,1.8},
{-3.0,0.0,1.8},
{-1.5,0.3,2.25},
{-1.6,0.3,2.025},
{-2.5,0.3,2.25},
{-2.3,0.3,2.025},
{-3.0,0.3,2.25},
{-2.7,0.3,2.025},
{-3.0,0.3,1.8},
{-2.7,0.3,1.8},
{-2.7,0.0,1.575},
{-2.7,-0.3,1.575},
{-3.0,-0.3,1.35},
{-3.0,0.0,1.35},
{-2.5,0.0,1.125},
{-2.5,-0.3,1.125},
{-2.65,-0.3,0.9375},
{-2.65,0.0,0.9375},
{-2.0,-0.3,0.9},
{-1.9,-0.3,0.6},
{-1.9,0.0,0.6},
{-3.0,0.3,1.35},
{-2.7,0.3,1.575},
{-2.65,0.3,0.9375},
{-2.5,0.3,1.125},
{-1.9,0.3,0.6},
{-2.0,0.3,0.9},
{1.7,0.0,1.425},
{1.7,-0.66,1.425},
{1.7,-0.66,0.6},
{1.7,0.0,0.6},
{2.6,0.0,1.425},
{2.6,-0.66,1.425},
{3.1,-0.66,0.825},
{3.1,0.0,0.825},
{2.3,0.0,2.1},
{2.3,-0.25,2.1},
{2.4,-0.25,2.025},
{2.4,0.0,2.025},
{2.7,0.0,2.4},
{2.7,-0.25,2.4},
{3.3,-0.25,2.4},
{3.3,0.0,2.4},
{1.7,0.66,0.6},
{1.7,0.66,1.425},
{3.1,0.66,0.825},
{2.6,0.66,1.425},
{2.4,0.25,2.025},
{2.3,0.25,2.1},
{3.3,0.25,2.4},
{2.7,0.25,2.4},
{2.8,0.0,2.475},
{2.8,-0.25,2.475},
{3.525,-0.25,2.49375},
{3.525,0.0,2.49375},
{2.9,0.0,2.475},
{2.9,-0.15,2.475},
{3.45,-0.15,2.5125},
{3.45,0.0,2.5125},
{2.8,0.0,2.4},
{2.8,-0.15,2.4},
{3.2,-0.15,2.4},
{3.2,0.0,2.4},
{3.525,0.25,2.49375},
{2.8,0.25,2.475},
{3.45,0.15,2.5125},
{2.9,0.15,2.475},
{3.2,0.15,2.4},
{2.8,0.15,2.4},
{0.0,0.0,3.15},
{0.0,-0.002,3.15},
{0.002,0.0,3.15},
{0.8,0.0,3.15},
{0.8,-0.45,3.15},
{0.45,-0.8,3.15},
{0.0,-0.8,3.15},
{0.0,0.0,2.85},
{0.2,0.0,2.7},
{0.2,-0.112,2.7},
{0.112,-0.2,2.7},
{0.0,-0.2,2.7},
{-0.002,0.0,3.15},
{-0.45,-0.8,3.15},
{-0.8,-0.45,3.15},
{-0.8,0.0,3.15},
{-0.112,-0.2,2.7},
{-0.2,-0.112,2.7},
{-0.2,0.0,2.7},
{0.0,0.002,3.15},
{-0.8,0.45,3.15},
{-0.45,0.8,3.15},
{0.0,0.8,3.15},
{-0.2,0.112,2.7},
{-0.112,0.2,2.7},
{0.0,0.2,2.7},
{0.45,0.8,3.15},
{0.8,0.45,3.15},
{0.112,0.2,2.7},
{0.2,0.112,2.7},
{0.4,0.0,2.55},
{0.4,-0.224,2.55},
{0.224,-0.4,2.55},
{0.0,-0.4,2.55},
{1.3,0.0,2.55},
{1.3,-0.728,2.55},
{0.728,-1.3,2.55},
{0.0,-1.3,2.55},
{1.3,0.0,2.4},
{1.3,-0.728,2.4},
{0.728,-1.3,2.4},
{0.0,-1.3,2.4},
{-0.224,-0.4,2.55},
{-0.4,-0.224,2.55},
{-0.4,0.0,2.55},
{-0.728,-1.3,2.55},
{-1.3,-0.728,2.55},
{-1.3,0.0,2.55},
{-0.728,-1.3,2.4},
{-1.3,-0.728,2.4},
{-1.3,0.0,2.4},
{-0.4,0.224,2.55},
{-0.224,0.4,2.55},
{0.0,0.4,2.55},
{-1.3,0.728,2.55},
{-0.728,1.3,2.55},
{0.0,1.3,2.55},
{-1.3,0.728,2.4},
{-0.728,1.3,2.4},
{0.0,1.3,2.4},
{0.224,0.4,2.55},
{0.4,0.224,2.55},
{0.728,1.3,2.55},
{1.3,0.728,2.55},
{0.728,1.3,2.4},
{1.3,0.728,2.4},
{0.0,0.0,0.0},
{1.5,0.0,0.15},
{1.5,0.84,0.15},
{0.84,1.5,0.15},
{0.0,1.5,0.15},
{1.5,0.0,0.075},
{1.5,0.84,0.075},
{0.84,1.5,0.075},
{0.0,1.5,0.075},
{1.425,0.0,0.0},
{1.425,0.798,0.0},
{0.798,1.425,0.0},
{0.0,1.425,0.0},
{-0.84,1.5,0.15},
{-1.5,0.84,0.15},
{-1.5,0.0,0.15},
{-0.84,1.5,0.075},
{-1.5,0.84,0.075},
{-1.5,0.0,0.075},
{-0.798,1.425,0.0},
{-1.425,0.798,0.0},
{-1.425,0.0,0.0},
{-1.5,-0.84,0.15},
{-0.84,-1.5,0.15},
{0.0,-1.5,0.15},
{-1.5,-0.84,0.075},
{-0.84,-1.5,0.075},
{0.0,-1.5,0.075},
{-1.425,-0.798,0.0},
{-0.798,-1.425,0.0},
{0.0,-1.425,0.0},
{0.84,-1.5,0.15},
{1.5,-0.84,0.15},
{0.84,-1.5,0.075},
{1.5,-0.84,0.075},
{0.798,-1.425,0.0},
{1.425,-0.798,0.0}
};

int [][] patches = {
    {32},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},
{4,17,18,19,8,20,21,22,12,23,24,25,16,26,27,28},
{19,29,30,31,22,32,33,34,25,35,36,37,28,38,39,40},
{31,41,42,1,34,43,44,5,37,45,46,9,40,47,48,13},
{13,14,15,16,49,50,51,52,53,54,55,56,57,58,59,60},
{16,26,27,28,52,61,62,63,56,64,65,66,60,67,68,69},
{28,38,39,40,63,70,71,72,66,73,74,75,69,76,77,78},
{40,47,48,13,72,79,80,49,75,81,82,53,78,83,84,57},
{57,58,59,60,85,86,87,88,89,90,91,92,93,94,95,96},
{60,67,68,69,88,97,98,99,92,100,101,102,96,103,104,105},
{69,76,77,78,99,106,107,108,102,109,110,111,105,112,113,114},
{78,83,84,57,108,115,116,85,111,117,118,89,114,119,120,93},
{121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136},
{124,137,138,121,128,139,140,125,132,141,142,129,136,143,144,133},
{133,134,135,136,145,146,147,148,149,150,151,152,69,153,154,155},
{136,143,144,133,148,156,157,145,152,158,159,149,155,160,161,69},
{162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177},
{165,178,179,162,169,180,181,166,173,182,183,170,177,184,185,174},
{174,175,176,177,186,187,188,189,190,191,192,193,194,195,196,197},
{177,184,185,174,189,198,199,186,193,200,201,190,197,202,203,194},
{204,204,204,204,207,208,209,210,211,211,211,211,212,213,214,215},
{204,204,204,204,210,217,218,219,211,211,211,211,215,220,221,222},
{204,204,204,204,219,224,225,226,211,211,211,211,222,227,228,229},
{204,204,204,204,226,230,231,207,211,211,211,211,229,232,233,212},
{212,213,214,215,234,235,236,237,238,239,240,241,242,243,244,245},
{215,220,221,222,237,246,247,248,241,249,250,251,245,252,253,254},
{222,227,228,229,248,255,256,257,251,258,259,260,254,261,262,263},
{229,232,233,212,257,264,265,234,260,266,267,238,263,268,269,242},
{270,270,270,270,279,280,281,282,275,276,277,278,271,272,273,274},
{270,270,270,270,282,289,290,291,278,286,287,288,274,283,284,285},
{270,270,270,270,291,298,299,300,288,295,296,297,285,292,293,294},
{270,270,270,270,300,305,306,279,297,303,304,275,294,301,302,271},
{306}
};

আরও পঠনযোগ্য সংস্করণ:

void setup() {
  size(640,480,P3D);
}

void draw() {
  background(0);
  noFill();
  stroke(255);
  translate(width/2,height/2,70);
  scale(30);
  rotateX(map(mouseX,0,width,0,TWO_PI));
  rotateY(map(mouseY,0,height,0,TWO_PI));
  for (int[] p:patches) {
    beginShape();
    for (int pt:p) {
      vertex(data[pt-1][0],data[pt-1][2],data[pt-1][2]);
    }
    endShape(CLOSE); 
  }
}

এবং কিছু ছবি:

সমাপ্ত পণ্য

কিছু আকর্ষণীয় প্রভাব সহ অন্য সংস্করণ:

void setup(){size(640,480,P3D);}
void draw(){
  background(0);noFill();stroke(255);
  translate(width/2,height/2,70);scale(30);
  rotateX(map(mouseX,0,width,0,TWO_PI));rotateY(map(mouseY,0,height,0,TWO_PI));
  for(int[] p:patches){
    //beginShape(QUADS);
    for(int pt:p){
      for(int pu:p){
        //vertex(data[pu-1][0],data[pu-1][4],data[pu-1][2]);
        line(data[pt-1][0],data[pt-1][5],data[pt-1][2],data[pu-1][0],data[pu-1][6],data[pu-1][2]);
    }}
    //endShape(CLOSE);
  }
}

সংস্করণ 2


স্পাউটটি আকার নেওয়ার জন্য এটি কমপক্ষে একবার প্যাচগুলি বিভক্ত করা উচিত।
লুসার droog

হ্যাঁ দ্বিতীয় ছবিটি আরও ভাল। আপনি সত্যই মহকুমা করছেন না, যদিও মনে হয়। প্রতিটি প্যাঁচের কিনারা হ'ল বেজিয়ার কার্ভস ... তবুও, +1 দেখতে এটি তেঁতুলের মতো লাগে!
লুসার droog 4'14

stroke(-1)এর চেয়ে এক বাইট সংক্ষিপ্তstroke(255)
ক্রিটসি লিথোস

11

পুনশ্চ

সম্পূর্ণরূপে গল্ফড নয়, তবে এটি ডেসটেলজৌ মহকুমার চেয়ে আলাদা পদ্ধতির চিত্র তুলে ধরেছে: ভিত্তি বহুপদী মূল্যায়ন করে। ম্যাট.পিএস ব্যবহার করে

(mat.ps)run[    % load matrix library, begin dictionary construction

/N 17
/C [ 0 7 4 ]   % Cam
/E [ 0 0 40 ] % Eye
/R 0 roty 120 rotx 90 rotz   % Rot: pan tilt twist
          matmul   matmul

/f(teapot)(r)file
/t{token pop exch pop}      % parse a number or other ps token
/s{(,){search not{t exit}if t 3 1 roll}loop}  % parse a comma-separated list
/r{token pop{[f 99 string readline pop s]}repeat}>>begin   % parse a count-prefixed paragraph of csv numbers
[/P[f r]/V[f r]/v{1 sub V exch get}        % Patches and Vertices and vert lookup shortcut
/B[[-1 3 -3 1][3 -6 3 0][-3 3 0 0][1 0 0 0]]              % Bezier basis matrix
/A{dup dup mul exch 2 copy mul 3 1 roll 1 4 array astore} % x->[x^3 x^2 x 1]
/M{[1 index 0 4 getinterval 2 index 4 4 getinterval       % flattened matrix->rowXcolumn matrix
3 index 8 4 getinterval 4 index 12 4 getinterval]exch pop}
/J{ C{sub}vop R matmul 0 get                              % perspective proJection  [x y z]->[X Y]
    aload pop E aload pop
    4 3 roll div exch neg
    4 3 roll add 1 index mul 4 1 roll
    3 1 roll sub mul}
>>begin

300 400 translate
1 14 dup dup scale div currentlinewidth mul setlinewidth  % global scale
/newline { /line {moveto /line {lineto} store} store } def
newline
P{
    8 dict begin
        [exch{v J 2 array astore}forall]/p exch def   % load patch vertices and project to 2D
        /X[p{0 get}forall] M B exch matmul B matmul def  % multiply control points by Bezier basis
        /Y[p{1 get}forall] M B exch matmul B matmul def

        0 1 N div 1 1 index .2 mul add{A/U exch def   % interpolate the polynomial over (u,v)/(N)
            /UX U X matmul def
            /UY U Y matmul def
            0 1 N div 1 1 index .2 mul add{A/V exch 1 array astore transpose def
                /UXV UX V matmul def
                /UYV UY V matmul def
                UXV 0 get 0 get
                UYV 0 get 0 get line
            }for
            newline
        }for

        0 1 N div 1 1 index .2 mul add{A/V exch def   % interpolate the polynomial over (u,v)/(N)
            /V [V] transpose def
            /XV X V matmul def
            /YV Y V matmul def
            0 1 N div 1 1 index .2 mul add{A/U exch 1 array astore transpose def
                /UXV U XV matmul def
                /UYV U YV matmul def
                UXV 0 get 0 get
                UYV 0 get 0 get line
            }for
            newline
        }for

    end

    %exit
}forall
stroke

বেজিয়ার-বেইজ টিপোট

1112

উল্লম্ব লাইনগুলি কেটে ফেলা এবং পরামিতিগুলি ছাড় দিয়ে এই 1112 চর সংস্করণটি পাওয়া যায়। ম্যাট.পিএস ব্যবহার করে

(mat.ps)run[    % 12

/N 17
/C [ 0 7 4 ]   % Cam 
/E [ 0 0 40 ] % Eye 
/R 0 roty 120 rotx 90 rotz   % Rot: pan tilt twist
          matmul   matmul

/f(teapot)(r)file/t{token pop exch pop}/s{(,){search not{t exit}if t   % 1100
3 1 roll}loop}/r{token pop{[f 99 string readline pop 
s]}repeat}>>begin[/P[f r]/V[f r]/v{1 sub 
V exch get}/B[[-1 3 -3 1][3 -6 3 0][-3 3 0 0][1 0 0 0]]/A{dup dup mul exch
2 copy mul 3 1 roll 1 4 array astore}/M{[1 index 0 4 getinterval 2 index 4 4 getinterval    
3 index 8 4 getinterval 4 index 12 4 getinterval]exch pop}/J{C{sub}vop R matmul 0 get    
aload pop E aload pop 4 3 roll div exch neg 4 3 roll add 1 index mul 4 1 roll
3 1 roll sub mul}>>begin 300 400 translate
1 14 dup dup scale div currentlinewidth mul setlinewidth  
/newline{/line{moveto/line{lineto}store}store}def newline
P{8 dict begin[exch{v J 2 array astore}forall]/p
exch def/X[p{0 get}forall] M B exch matmul B matmul
def/Y[p{1 get}forall] M B exch matmul B matmul def 
0 1 N div 1 1 index .2 mul add{A/U exch def/UX U X matmul def/UY U Y matmul def 
0 1 N div 1 1 index .2 mul add{A/V exch 1 array astore transpose
def/UXV UX V matmul def/UYV UY V matmul def UXV 0 get 0 get UYV 0 get 0 get line}for
newline}for end}forall stroke

বেজিয়ার-ভিত্তিক লুপগুলি

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