\ .\" This man page was generated by the Netpbm tool 'makeman' from HTML source. .\" Do not hand-hack it! If you have bug fixes or improvements, please find .\" the corresponding HTML page on the Netpbm website, generate a patch .\" against that, and send it to the Netpbm maintainer. .TH "Pamtris User Manual" 0 "15 April 2021" "netpbm documentation" .PP .SH "نام (NAME)" pamtris \- شطرنجی‌ساز مثلث با درونیابی تصحیح‌شده از نظر پرسپکتیو برای مشخصه‌های عمومی رأس و بافر عمق .UN synopsis .SH "خلاصه دستور (SYNOPSIS)" \fBpamtris\fP \fB-width=\fP\fIwidth\fP \fB-height=\fP\fIheight\fP {\ \fB-num_attribs=\fP\fIattributes_per_vertex\fP [\ \fB-tupletype=\fP\fItupletype\fP\ ] | \fB-rgb\fP | \fB-grayscale\fP\ } [\ \fB-maxval=\fP\fImaxval\fP\ ] .PP می‌توان تمام گزینه‌ها را به کوتاه‌ترین پیشوند یکتای آن‌ها مخفف کرد. می‌توانید برای مشخص کردن یک گزینه، به جای یک خط تیره از دو خط تیره استفاده نمایید. می‌توانید بین نام گزینه و مقدار آن از فاصله یا علامت مساوی استفاده کنید. .UN description .SH "توضیحات (DESCRIPTION)" .PP این برنامه بخشی از .BR "Netpbm" (1)\c \& است. .PP برنامه \fBpamtris\fP را می‌توان برای رسم طیف گسترده‌ای از گرافیک‌های دوبعدی و سه‌بعدی با ترکیب تصاویری با پیچیدگی دلخواه از مثلث‌های مجزا، نوارهای مثلثی (triangle strips) و بادبزن‌های مثلثی (triangle fans) استفاده کرد. این برنامه دستورالعمل‌های نوشته‌شده در قالب یک اسکریپت دستوری ساده را از ورودی استاندارد می‌خواند و نتایج را به عنوان یک جریان PAM (که احتمالاً چندتصویری است) در خروجی استاندارد تولید می‌کند. .PP به عنوان مثال، ورودی زیر .nf \f(CW mode fan attribs 0 128 0 vertex 0 0 1 attribs 0 0 128 vertex 200 0 1 attribs 50 20 103 vertex 190 61 1 attribs 100 40 78 vertex 161 117 1 attribs 150 60 53 vertex 117 161 1 attribs 200 80 28 vertex 61 190 1 attribs 250 100 3 vertex 0 200 1 print \fP .fi .PP این خروجی را تولید می‌کند: .PP .B نمونه خروجی pamtris برای حالت FAN .IMG -C pamtris_fan.png .PP فایل ورودی، داده‌های مثلث را در صورت نیاز با تنظیم حالت رسم مناسب و سپس با ارائه فهرستی از رأس‌ها (vertices) مشخص می‌کند. هر رأس به فهرستی از حداکثر ۲۰ «مشخصه» (attribute) مرتبط است که مقادیر صحیح بین ۰ و یک maxval معین هستند. در متداول‌ترین کاربرد، شما از \fBpamtris\fP برای رسم یک تصویر بصری استفاده می‌کنید و هر رأس دارای سه مشخصه است که بیانگر مقادیر RGB رنگ هستند. چنین فهرست‌های مشخصه‌ای را می‌توان به ازای هر رأس ارائه داد. .PP پیش از نوشتن نهایی یک تصویر PAM در خروجی استاندارد، \fBpamtris\fP ابتدا آن را بر روی یک بافر فریم (frame buffer) داخلی شطرنجی می‌کند که شامل یک «بافر تصویر» (image buffer) و یک «بافر عمق» (depth buffer) است. بافر تصویر از دنباله‌ای از سطرهای \fIheight\fP تشکیل شده است که حاوی دنباله‌ای از تاپل‌های \fIwidth\fP هستند. برای هر مشخصه رأس، یک نمونه در هر تاپل به همراه یک نمونه کدر بودن (آلفا) وجود دارد. هر تاپل در بافر تصویر با یک عمق صحیح در بافر عمق نیز مرتبط است که تعیین می‌کند آیا عملیات رسم بعدی بر آن تاپل خاص تأثیر می‌گذارد یا خیر. این قابلیت روشی برای مرتب‌سازی عمقی (depth-sorting) اشیای گرافیکی فراهم می‌کند که برای بسیاری از کاربردهای گرافیک رایانه‌ای دوبعدی و سه‌بعدی کفایت می‌کند. با این حال، یک کاستی عمده این رویکرد در مرتب‌سازی عمقی این است که به صورت خودکار با اشیایی که قرار است «نیمه‌شفاف» به نظر برسند کار نمی‌کند؛ بنابراین برای گنجاندن چنین اشیایی در تصاویر تولیدشده با این روش، به راهبردهای پیچیده‌تری نیاز است. .PP نمونه کدر بودن (شفافیت)، آخرین نمونه تاپل است. برنامه \fBpamtris\fP شفافیت را به صورت داخلی مدیریت می‌کند و برای هر تاپل همیشه مقدار آن یا ۰ است یا maxval. این برنامه کنترل مستقیمی بر صفحه تصویر آلفا در اختیار کاربر قرار نمی‌دهد. .PP برنامه \fBpamtris\fP مثلث‌ها را با تقریب زدن ناحیه مرئی آن‌ها به صورت مجموعه‌ای از تاپل‌ها در موقعیت‌های خاص در بافر فریم شطرنجی می‌کند، و به هر نمونه از هر تاپل، مقداری اختصاص می‌دهد که یک درونیابی تصحیح‌شده از نظر پرسپکتیو میان مقادیر مشخصه متناظر برای هر رأس مثلث است. هر زمان که تاپلی در محدوده بافر فریم تولید شود، اگر و تنها اگر در آزمون عمق (depth test) پذیرفته شود، در موقعیت متناظر در بافر فریم نوشته می‌شود. این آزمون به این صورت عمل می‌کند: مقدار عمق هر تاپل ورودی (که خود یک درونیابی میان مختصات Z رأس‌های مثلث مربوطه است) با مقدار موجود در موقعیت متناظر در بافر عمق مقایسه می‌شود. اگر مقدار عمق تاپل ورودی برابر یا کوچک‌تر از مقدار عمق فعلی در آن موقعیت از بافر عمق باشد، وقایع زیر رخ می‌دهد: .IP \(bu هر نمونه \fIi\fP (که در آن 0 ≤ \fIi\fP < \fInum_attribs\fP) از تاپل در موقعیت متناظر در بافر تصویر برابر با مقدار نمونه مربوطه از تاپل ورودی قرار می‌گیرد؛ و نمونه آلفا (آخرین نمونه) به \fImaxval\fP به‌روزرسانی می‌شود؛ .IP \(bu مقدار عمق در موقعیت متناظر در بافر عمق به یک مقدار عمق که مستقیماً متناسب با تاپل ورودی است به‌روزرسانی می‌گردد. .PP در غیر این صورت، آن تاپل خاص هیچ تغییری در بافر فریم ایجاد نمی‌کند. .PP بافر فریم در ابتدا به گونه‌ای تنظیم می‌شود که تمام نمونه‌ها در هر تاپل از بافر تصویر حاوی مقدار ۰ باشند، و تمام ورودی‌ها در بافر عمق شامل حداکثر مقدار مجاز عمق باشند. .PP مقادیر مشخصه‌ها، و بنابراین نمونه‌ها در تصاویر PAM خروجی، هیچ تفسیر ثابتی به آن‌ها نسبت داده نشده است (به جز آخرین صفحه تصویر، که عامدانه قرار است بیانگر اطلاعات شفافیت تاپل باشد)؛ هر کسی می‌تواند معنای مناسبی را به آن‌ها نسبت دهد، مانند رنگ‌ها، مختصات بافت (texture coordinates)، بردارهای نرمال سطح، ویژگی‌های برهم‌کنش نور، ضرایب تأثیر بافت برای بافت‌دهی چندگانه و غیره. .UN examples .SH "مثال‌ها (EXAMPLES)" .UN examples_fan .SS "حالت بادبزنی (Fan Mode)" .PP دستور زیر تصویری را از مثال حالت بادبزنی در بالای بخش .UR #description توضیحات (DESCRIPTION) .UE \& تولید می‌کند. اگر فایل \fBfan.tris\fP حاوی آن کد باشد، می‌توانید آن را با دستور زیر پردازش کنید: .nf \f(CW $ pamtris -height=200 -width=200 -rgb fan.pam \fP .fi .UN examples_strip .SS "حالت نواری (Strip Mode)" .PP در ادامه نمونه‌ای از حالت نواری آمده است: .nf \f(CW mode strip attribs 255 0 0 # red vertex 0 200 1 vertex 50 0 1 attribs 0 0 0 # black vertex 100 200 1 attribs 0 205 205 # cyan vertex 150 0 1 attribs 0 0 255 # blue vertex 200 200 1 vertex 250 0 1 print \fP .fi .PP کد بالا را در فایلی به نام \fBstrip.tris\fP (به عنوان مثال) ذخیره کنید و آن را با دستور زیر پردازش نمایید: .nf \f(CW $ pamtris -height=200 -width=200 -rgb strip.pam \fP .fi تا خروجی زیر حاصل شود: .PP .B نمونه خروجی pamtris برای حالت STRIP .IMG -C pamtris_strip.png .UN examples_triangles .SS "حالت مثلثی (Triangle Mode)" .PP در ادامه نمونه‌ای از حالت مثلثی آمده است: .nf \f(CW # yellow square mode strip attrib 155 155 0 vertex 50 50 100 vertex 50 200 100 vertex 200 50 100 vertex 200 200 100 # blue triangle mode triangles attrib 0 205 205 vertex 20 125 70 attrib 0 0 140 vertex 230 70 120 # Change "120" and see what happens vertex 230 180 120 # print \fP .fi .PP کد بالا را در فایلی به نام \fBpierce.tris\fP (برای مثال) ذخیره کنید و با دستور زیر پردازش نمایید: .nf \f(CW $ pamtris -height=200 -width=200 -rgb pierce.pam \fP .fi تا خروجی زیر حاصل شود: .PP .B نمونه خروجی pamtris برای حالت TRIANGLES .IMG -C pamtris_pierce.png .UN pamtris_c .SS "فرا‌برنامه‌نویسی (Meta-programming)" .PP زبان دستورات \fBpamtris\fP بسیار ابتدایی‌تر از آن است که بتوان مستقیماً برای رسم‌های جدی از آن استفاده کرد؛ احتمالاً ترجیح می‌دهید از یک زبان برنامه‌نویسی همه‌منظوره برای تولید یک فایل دستورات موقت \fBpamtris\fP استفاده کنید. .PP به عنوان مثال، روال \fBdraw_polygon\fP در برنامه C زیر، دستورات \fBpamtris\fP را برای رسم یک چندضلعی منتظم تولید می‌کند. این کار با ایجاد تعدادی دستور \fBvertex\fP در امتداد محیط دایره محیطی مربوطه انجام می‌شود. (توجه: تصویر PAM تولیدشده از طریق لوله‌کشی خروجی برنامه زیر به \fBpamtris\fP، متعاقباً با دستور \fBpamscale\ -linear\ -xscale\ 0.25\ -yscale\ 0.25\fP کوچک شد تا اثر .UR #antialias لبه‌های صاف‌شده (anti-aliased) .UE \& حاصل شود.) .PP .B چندضلعی‌های منتظم .IMG -C pamtris_polygons.png .nf \f(CW /* ----------------------- * * width = 512 * * height = 512 * * num_attribs = 3 * * tupletype = RGB_ALPHA * * ----------------------- */ #include #include #include #define PI 3.14159265358979323844 void draw_polygon (int const center_x, int const center_y, int const radius, int const sides) { printf("mode fan\en" "vertex %d %d 0\en", center_x, center_y); for(int i = 0; i <= sides; i++) { int const x = round(center_x + radius * cos(i*2.0*PI / sides)); int const y = round(center_y - radius * sin(i*2.0*PI / sides)); printf("vertex %d %d 0\en", x, y); } } int main(void) { puts("attribs 0 185 80"); /* color: green */ draw_polygon(300, 210, 150, 5); /* draws pentagon */ puts("attribs 255 15 240"); /* color: magenta */ draw_polygon(150, 320, 100, 7); /* draws heptagon */ puts("!"); } \fP .fi .UN options .SH "گزینه‌ها (OPTIONS)" .PP علاوه بر گزینه‌های مشترک در تمام برنامه‌های مبتنی بر libnetpbm (به‌ویژه \fB-quiet\fP، به .UR index.html#commonoptions گزینه‌های عمومی (Common Options) .UE \& مراجعه کنید)، \fBpamtris\fP گزینه‌های خط فرمان زیر را می‌شناسد:
.TP \fB-width=\fP\fIwidth\fP عرض بافر فریم داخلی و در نتیجه عرض تصاویر PAM خروجی را بر حسب تعداد ستون‌ها تعیین می‌کند. این مقدار باید یک عدد صحیح در بازه بسته [1, 8192] باشد. .sp این گزینه اجباری است. .TP \fB-height=\fP\fIheight\fP ارتفاع بافر فریم داخلی و در نتیجه ارتفاع تصاویر PAM خروجی را بر حسب تعداد سطرها تعیین می‌کند. این مقدار باید یک عدد صحیح در بازه بسته [1, 8192] باشد. .sp این گزینه اجباری است. .TP \fB-num_attribs=\fP\fIattributes_per_vertex\fP تعداد مشخصه‌ها به ازای هر رأس است. عمق تصاویر PAM خروجی برابر با این مقدار به علاوه یک خواهد بود (برای اختصاص به صفحه آلفا). آرگومان باید یک عدد صحیح در بازه بسته [1, 20] باشد. .sp جریان دستورالعمل‌های ورودی می‌تواند با یک دستور \fBreset\fP این مقدار را تغییر دهد. .sp باید دقیقاً یکی از گزینه‌های \fB-num_attribs\fP، \fB-rgb\fP یا \fB-grayscale\fP را مشخص کنید. .TP \fB-tupletype=\fP\fItupletype\fP نوع تاپل برای تصاویر PAM خروجی است. این آرگومان رشته‌ای است که نباید طولانی‌تر از ۲۵۵ نویسه باشد. .sp جریان دستورالعمل‌های ورودی می‌تواند با یک دستور \fBreset\fP این مقدار را تغییر دهد. .sp پیش‌فرض یک رشته تهی است. .sp این گزینه نمی‌تواند همراه با \fB-rgb\fP یا \fB-grayscale\fP مشخص شود. .TP \fB-rgb\fP این یک گزینه تسهیل‌کننده است که صرفاً به عنوان یک نام مستعار برای \fB-num_attribs=\fP3 \fB-tupletype=\fPRGB_ALPHA عمل می‌کند. به عبارت دیگر، این گزینه روشی سریع برای مشخص کردن این است که قصد دارید از \fBpamtris\fP برای رسم مستقیم تصاویر رنگی RGB(_ALPHA) استفاده کنید، و سه مشخصه رأس عبارتند از مقادیر سطوح قرمز، سبز و آبی رنگ مرتبط با رأس، به همان ترتیب. .sp جریان دستورالعمل‌های ورودی می‌تواند با یک دستور \fBreset\fP این مقدار را بازنویسی کند. .sp باید دقیقاً یکی از گزینه‌های \fB-num_attribs\fP، \fB-rgb\fP یا \fB-grayscale\fP را مشخص کنید. .sp این گزینه در Netpbm 10.85 (دسامبر 2018) اضافه شد. .TP \fB-grayscale\fP یک گزینه تسهیل‌کننده دیگر، مشابه با \fB-rgb\fP؛ با این تفاوت که این گزینه یک نام مستعار برای \fB-num_attribs=\fP1 \fB-tupletype=GRAYSCALE_ALPHA\fP است. تنها مشخصه رأس، سطح خاکستری مرتبط با رأس خواهد بود. .sp جریان دستورالعمل‌های ورودی می‌تواند با یک دستور \fBreset\fP این مقدار را بازنویسی کند. .sp باید دقیقاً یکی از گزینه‌های \fB-num_attribs\fP، \fB-rgb\fP یا \fB-grayscale\fP را مشخص کنید. .sp این گزینه در Netpbm 10.85 (دسامبر 2018) اضافه شد. .TP \fB-maxval=\fP\fImaxval\fP مقدار maxval تصاویر PAM خروجی را تعیین می‌کند، که حداکثر مقدار مجاز برای هر مشخصه رأس نیز هست. این مقدار باید یک عدد صحیح در بازه بسته [1, 65535] باشد. .sp مقدار پیش‌فرض 255 است. .sp جریان دستورالعمل‌های ورودی می‌تواند با یک دستور \fBreset\fP این مقدار را بازنویسی کند. .UN instruction_code .SH "کدهای دستورالعمل (INSTRUCTION CODE)" .PP ورودی برای \fBpamtris\fP شامل جریانی از سطرهای متنی است که از ورودی استاندارد خوانده می‌شوند. .PP سطرهای خالی یا سطرهایی که فقط حاوی نویسه‌های فاصله خالی هستند، سطرهای خالی نامیده شده و نادیده گرفته می‌شوند. .PP هنگامی که علامت \fB#\fP در هر کجای سطر قرار گیرد، \fBpamtris\fP آن را به همراه تمام نویسه‌های پس از آن نادیده می‌گیرد. به عبارت دیگر، از \fB#\fP تا انتهای سطر همانند فاصله خالی رفتار می‌شود. .PP سطرهایی که خالی نیستند باید شامل دنباله‌ای از رشته‌ها به نام توکن (token) باشند که با فاصله خالی از یکدیگر جدا شده‌اند. اولین توکن باید یکی از دستورات شناخته‌شده توسط \fBpamtris\fP باشد، و تمام توکن‌های بعدی (در صورت وجود) به عنوان آرگومان‌های آن دستور تفسیر می‌شوند. هنگامی که تعداد ناکافی از آرگومان‌ها برای یک دستور ارائه شود، سطر نامعتبر تلقی شده و همانند یک سطر خالی با آن برخورد می‌شود. همین حالت زمانی رخ می‌دهد که آرگومانی خارج از محدوده یا از نوعی نامناسب داده شود (برای مثال زمانی که به جای مقدار عددی، رشته‌ای از حروف داده شود)، یا هنگامی که دستور/آرگومان ناشناخته‌ای یافت شود. هنگامی که تعداد آرگومان‌ها بیشتر از مقدار لازم برای یک دستور خاص باشد، تنها بخش مربوط به آخرین آرگومان مورد نیاز بررسی شده و توکن‌های اضافی بعدی نادیده گرفته می‌شوند. .PP برنامه \fBpamtris\fP به بزرگی و کوچکی حروف حساس نیست (case-insensitive)؛ یعنی \fBmode\fP، \fBMODE\fP، \fBmODe\fP و غیره همگی به یک صورت پردازش می‌شوند. .PP دستورات شناخته‌شده توسط \fBpamtris\fP عبارتند از: .TP \fBmode\fP .TP \fBattribs\fP .TP \fBvertex\fP .TP \fBprint\fP .TP \fBclear\fP .TP \fBreset\fP .TP \fBquit\fP .PP می‌توانید از کوتاه‌ترین پیشوند یکتای نام دستور استفاده کنید. می‌توانید از علامت تعجب (\fB!\fP) به جای دستور \fBprint\fP و از علامت ستاره (\fB*\fP) به جای \fBclear\fP استفاده نمایید. .PP عملکرد این دستورات به شرح زیر است: .TP \fBmode\fP { triangles | strip | fan } .sp این دستور موجب ورود \fBpamtris\fP به یک حالت رسم جدید می‌شود. آرگومان یک کلمه است که حالت جدید را مشخص می‌کند. به جای نام کامل آرگومان، می‌توان از کوتاه‌ترین پیشوند یکتای آن استفاده کرد که همان اثر را دارد. حالت رسم تا زمانی که دستور \fBmode\fP بعدی صادر شود یکسان باقی خواهد ماند. .sp این دستور همچنین فهرست رأس‌های فعلی را بازنشانی می‌کند، که پس از اجرای دستور در یک وضعیت خالی (مجدداً) مقداردهی اولیه می‌شود. می‌توان با فراخوانی‌های پیاپی دستور \fBvertex\fP (به زیر مراجعه کنید) رأس‌های جدیدی به این فهرست افزود. نیازی نیست نگران ارائه «تعداد بیش از حد» رأس باشید، چرا که فهرست رأس‌ها مجازی‌سازی شده است: \fBpamtris\fP در هر لحظه تنها وضعیت مربوط به سه رأس را حفظ می‌کند. فهرست رأس‌های فعلی در ابتدا خالی است. .sp مجاز است دستوری به \fBpamtris\fP داده شود که به آن دستور دهد به حالت رسمی وارد شود که هم‌اکنون در آن قرار دارد. می‌توان از این رویکرد برای بازنشانی فهرست رأس‌های فعلی بدون تغییر حالت رسم فعلی استفاده کرد. .sp صرف‌نظر از حالت رسم فعلی، برنامه به محض این‌که رأس‌های لازم برای رسم یک مثلث جدید را از طریق فهرست رأس‌های فعلی فراهم کنید، فوراً یک مثلث جدید را روی بافر فریم شطرنجی می‌کند. (اگر قبل از ارائه تمامی رأس‌های لازم برای رسم یک مثلث جدید، فهرست رأس‌ها را بازنشانی کنید، برنامه عملاً رأس‌هایی را که تا آن لحظه به فهرست اضافه شده بودند بدون استفاده از آن‌ها برای رسم هیچ مثلث جدیدی از فهرست دور می‌ریزد.) .sp در توضیحات زیر درباره هر حالت رسم، اندیس‌ها (شماره‌های ترتیبی) رأس‌ها و مثلث‌ها بر پایه ۰ هستند. .sp آرگومان \fBtriangles\fP به \fBpamtris\fP دستور می‌دهد وارد حالت رسم "TRIANGLES" شود. در این حالت، مجموعه‌ای از مثلث‌های مجزا ساخته می‌شود. هر سه رأسی که به فهرست رأس‌های فعلی فرستاده شوند، یک مثلث جدید را مشخص می‌کنند. به بیان رسمی، این بدان معناست که هر مثلث \fIN\uth\d\fP توسط رأس‌های 3*\fIN\fP، 3*\fIN\fP\ +\ 1 و 3*\fIN\fP\ +\ 2 مشخص می‌شود. این حالت، حالت اولیه پیش‌فرض است و بنابراین نیازی نیست پیش از رسم هرگونه مثلث به طور صریح تنظیم شود. .sp آرگومان \fBstrip\fP به \fBpamtris\fP دستور می‌دهد وارد حالت رسم "STRIP" شود. در این حالت، \fBpamtris\fP یک «نوار مثلثی» می‌سازد؛ بدین معنی که سه رأس اول ارائه‌شده به فهرست رأس‌های فعلی، مثلث اول را مشخص می‌کنند، و هر رأس جدیدی که پس از آن اضافه شود، به همراه دو رأس قبلی، مثلث بعدی را مشخص می‌کند. به بیان رسمی، این بدان معناست که هر مثلث \fIN\fP\uth\d توسط رأس‌های \fIN\fP، \fIN\fP\ +\ 1 و \fIN\fP\ +\ 2 مشخص می‌شود. .sp آرگومان \fBfan\fP به \fBpamtris\fP دستور می‌دهد وارد حالت رسم "FAN" شود. در این حالت، یک اصطلاحاً «بادبزن مثلثی» ساخته می‌شود؛ بدین معنی که سه رأس اول ارائه‌شده به فهرست رأس‌های فعلی مثلث اول را مشخص می‌کنند، و هر رأس جدیدی که پس از آن اضافه شود، به همراه رأس قبلی و نخستین رأس، مثلث بعدی را مشخص می‌سازد. به بیان رسمی، این بدان معناست که هر مثلث \fIN\fP\uth\d توسط رأس‌های \fI0\fP، \fIN\fP\ +\ 1 و \fIN\fP\ +\ 2 مشخص می‌شود. .TP \fBattribs\fP \fIa0\fP \fIa1\fP \fIa2\fP ... \fIanum_attribs - 1\fP .sp این دستور فهرست مقادیر مشخصه‌های فعلی را به‌روزرسانی می‌کند. این دستور به عنوان آرگومان دنباله‌ای از اعداد صحیح به تعداد \fInum_attribs\fP می‌گیرد که نمایانگر مقادیر مشخصه‌هایی هستند که به رأس بعدی تخصیص می‌یابند. این دنباله از مقادیر همان «فهرست مقادیر مشخصه‌های فعلی» است که ذکر شد. .sp هر آرگومان \fIi\uth\d\fP (که در آن 0 ≤ \fIi\fP < \fInum_attribs\fP) نشان‌دهنده مقداری است که باید به مشخصه \fIi\fP\uth\d از فهرست مقادیر مشخصه‌های فعلی اختصاص یابد. تمام آرگومان‌ها باید مقادیر صحیح در بازه بسته [0, \fImaxval\fP] باشند. اگر تعداد آرگومان‌های ارائه‌شده کمتر از مقدار فعلی \fInum_attribs\fP باشد، دستور نامعتبر تلقی شده و نادیده گرفته می‌شود. .sp فهرست مقادیر مشخصه‌های فعلی تا زمانی که دستور معتبر بعدی \fBattribs\fP یا \fBreset\fP صادر نشود دست‌نخورده باقی می‌ماند. دستور \fBattribs\fP امکان تغییر مقادیر هر مشخصه را به صورت مجزا فراهم می‌سازد، در حالی که دستور \fBreset\fP به طور ویژه برای این کار طراحی نشده است، اما دارای اثر جانبی تنظیم تمام مقادیر فهرست مقادیر مشخصه‌های فعلی به \fImaxval\fP است (به زیر مراجعه کنید). .sp تمام مقادیر موجود در فهرست مقادیر مشخصه‌های فعلی در ابتدا روی \fImaxval\fP تنظیم شده‌اند.
\fBvertex\fP \fIx\fP \fIy\fP \fIz\fP [\fIw\fP] .sp یک رأس جدید به فهرست رأس‌های فعلی اضافه می‌کند (به دستور \fBmode\fP در بالا مراجعه کنید)، و مقادیر آرگومان‌ها را به مختصات متناظر آن، و مقادیر فهرست مقادیر مشخصه‌های فعلی (به دستور \fBattribs\fP در بالا مراجعه کنید) را به ورودی‌های مربوطه در فهرست مشخصه‌های مرتبط با رأس اختصاص می‌دهد. .sp مقادیر \fIx\fP، \fIy\fP و \fIz\fP باید مقادیر صحیح در بازه بسته [-32767, 32767] باشند. مقادیر \fIx\fP و \fIy\fP به ترتیب نشان‌دهنده ستون و سطر تاپلی هستند که با موقعیت رأس مطابقت دارد. چنین مقادیری ممکن است متناظر با تاپل‌هایی خارج از محدوده‌های بافر فریم باشند. مبدا دستگاه مختصات در تاپل گوشه بالا و سمت چپ بافر فریم قرار دارد. محور X از چپ به راست، و محور Y از بالا به پایین امتداد دارد. مقدار منفی برای \fIx\fP نشان‌دهنده ستونی به همان تعداد تاپل در سمت چپ چپ‌ترین ستون بافر فریم است. به همین ترتیب، مقدار منفی برای \fIy\fP نشان‌دهنده سطری به همان تعداد تاپل بالاتر از بالاترین سطر بافر فریم است. توجه داشته باشید که این مختصات صرف‌نظر از این‌که تصویری که رسم می‌کنید دارای جلوه «پرسپکتیو» باشد یا خیر، مستقیماً با یک نقطه خاص در دستگاه مختصات فوق منطبق است؛ برنامه \fBpamtris\fP مختصات داده‌شده را به هیچ وجه دچار «اعوجاج» یا تبدیل نمی‌کند. بنابراین اگر می‌خواهید تصاویری دارای پرسپکتیو رسم کنید، باید پیش از ارائه مقادیر به برنامه، خودتان با استفاده از یک روش پرتاب پرسپکتیو خارجی، مقادیر \fIx\fP و \fIy\fP را که در دستگاه مختصات \fBpamtris\fP پرتاب شده‌اند محاسبه نمایید. .sp پارامتر \fIz\fP نشان‌دهنده مختصات Z رأس است، که برای محاسبه مقادیر عمق تاپل‌ها در نواحی مثلث‌های شطرنجی‌شده استفاده می‌شود. به طور شهودی، مقادیر کوچک‌تر برای \fIz\fP به معنای «نزدیک‌تر به بیننده»، و مقادیر بزرگ‌تر به معنای «دورتر از بیننده» هستند (اما به خاطر داشته باشید: همان‌گونه که در بالا ذکر شد، مختصات \fIx\fP و \fIy\fP به هیچ وجه اعوجاج نمی‌یابند، که بدان معناست که تحت تأثیر \fIz\fP یا پارامتر بعدی قرار نمی‌گیرند). .sp به صورت اختیاری، می‌توانید پارامتر \fIw\fP را ارائه دهید که نشان‌دهنده یک «ضریب تصحیح پرسپکتیو» است که برای درونیابی صحیح مشخصه‌های رأس در سرتاسر مساحت مثلث مربوطه استفاده می‌شود. این مقدار باید یک عدد صحیح در بازه بسته [1, 1048575] باشد. اگر مقداری برای آن ارائه ندهید، مقدار پیش‌فرض ۱ استفاده خواهد شد (بنابراین، اگر می‌خواهید اثرات تصحیح پرسپکتیو را بر روی یک مثلث خنثی کنید تا نمونه‌های خروجی مانند درونیابی خطی ساده محاسبه شوند، کافی است مقداری برای \fIw\fP در هیچ‌یک از رأس‌های آن مثلث تعیین نکنید). اما اگر قصد دارید هندسه سه‌بعدی را با پرسپکتیو رسم نمایید، باید مقداری مناسب برای این پارامتر ارائه دهید، در غیر این صورت تصاویر خروجی ممکن است بسیار نادرست به نظر برسند. پارامتر \fIw\fP در Netpbm 10.85 (دسامبر 2018) معرفی شد. .sp مدل متداول .UR https://en.wikipedia.org/wiki/Viewing_frustum هرم دید (viewing frustum) .UE \& را در نظر بگیرید که برای پرتاب رأس‌ها از «فضای دنیای» سه‌بعدی به یک «فضای تصویر» صفحه‌ای استفاده می‌شود. اگر این قرارداد را بپذیریم که «صفحه z» به معنای هر صفحه‌ای موازی با صفحه دید (view-plane) است، مقدار \fIw\fP برای یک رأس باید (کوچک‌ترین/اقلیدسی/عمود) فاصله بر حسب پیکسل بین نقطه مرجع پرتاب (PRP یا "چشم") و صفحه z شامل آن رأس باشد. یک راه برای محاسبه این مقدار، صرفاً محاسبه ضرب داخلی (dot product) میان بردار سه‌بعدی \fBr\fP و بردار واحد سه‌بعدی \fBn\fP است، که در آن \fBr\fP برداری است که از نقطه مرجع پرتاب (PRP یا "چشم") به رأس می‌رود، و \fBn\fP یک بردار نرمال صفحه دید (VPN) با طول واحد است که جهتی خلاف جهت PRP دارد. به عبارت دیگر، این مقدار برابر با طول تصویر عمودی \fBr\fP بر روی خط تعیین‌شده توسط \fBn\fP است. .sp (توجه: برای هر دو بردار سه‌بعدی \fBa\fP و \fBb\fP با مؤلفه‌های اسکالر حقیقی متناظر ax، ay، az و bx، by، bz، ضرب داخلی میان \fBa\fP و \fBb\fP برابر است با: ax*bx\ +\ ay*by\ +\ az*bz.) .TP \fBprint\fP .sp این دستور یک تصویر PAM را در خروجی استاندارد می‌نویسد که داده‌های شطرنجی آن یک رونوشت از محتوای فعلی بافر تصویر است. مقادیر فیلدهای WIDTH و HEIGHT به ترتیب برابر با عرض و ارتفاع بافر فریم هستند که در خط فرمان هنگام فراخوانی برنامه تعیین شده‌اند. فیلد MAXVAL برابر با maxval فعلی؛ فیلد DEPTH برابر با مقدار فعلی \fInum_attribs\fP + 1؛ و فیلد TUPLTYPE برابر با tupletype فعلی است. .sp این دستور هیچ اثری بر وضعیت رسم فعلی ندارد؛ مثلاً حالت رسم فعلی، فهرست رأس‌های فعلی و غیره را تغییر نمی‌دهد. .sp می‌توان تعداد دلخواهی از دستورات \fBprint\fP را در موقعیت‌های مختلف توالی دستورالعمل‌های ورودی صادر کرد تا یک جریان چندتصویری از PAM تولید شود. .TP \fBclear\fP [ image | depth ] .sp بافر فریم را پاک می‌کند. بدین معنا که تمامی نمونه‌ها در بافر تصویر مجدداً روی ۰ تنظیم شده، و تمامی ورودی‌ها در بافر عمق مجدداً به حداکثر مقدار مجاز عمق بازمی‌گردند. .sp به صورت اختیاری، می‌توان آرگومانی ارائه داد تا فقط بافر تصویر یا بافر عمق به صورت جداگانه پاک شود و دیگری دست‌نخورده باقی بماند. با آرگومان \fBimage\fP، تنها بافر تصویر پاک می‌شود؛ با آرگومان \fBdepth\fP، تنها بافر عمق پاک می‌شود. به جای نام‌های کامل آرگومان، می‌توان از کوتاه‌ترین پیشوند یکتای آن‌ها استفاده کرد که همان اثر را دارد. نویسه تکی \fBz\fP نیز به عنوان نام مستعار برای \fBdepth\fP پذیرفته می‌شود. .sp همانند دستور \fBprint\fP، این دستور نیز هیچ اثری بر وضعیت رسم فعلی ندارد. .TP \fBreset\fP \fImaxval\fP \fInum_attribs\fP [\fItupletype\fP] .sp این دستور مقادیر فعلی maxval و تعداد مشخصه‌ها به ازای هر رأس (num_attribs) را به‌روزرسانی کرده و هم‌زمان بافر تصویر را با یک maxval جدید و تعداد نمونه‌های جدید در هر تاپل بازنشانی می‌کند. پارامتر \fImaxval\fP باید یک عدد صحیح در بازه بسته [1, 65535] و \fInum_attribs\fP باید یک عدد صحیح در بازه بسته [1, 20] باشد. .sp به صورت اختیاری، پس از آرگومان دوم، می‌توان رشته‌ای را ارائه داد تا به \fItupletype\fP فعلی اختصاص یابد. این رشته از اولین نویسه غیر فاصله خالی پس از آرگومان دوم آغاز شده و تا آخرین نویسه غیر فاصله خالی قبل از انتهای سطر (شامل آن) ادامه می‌یابد. اگر tupletype جدیدی ارائه نشود یا رشته ارائه‌شده طولانی‌تر از ۲۵۵ نویسه باشد، رشته خالی به \fItupletype\fP فعلی اختصاص می‌یابد. .sp اثرات جانبی اجرای این دستور عبارتند از: .IP \(bu بافر تصویر جدید به محض اجرای دستور به طور کامل پاک می‌شود. .IP \(bu تمام مقادیر موجود در فهرست مقادیر مشخصه‌های فعلی روی maxval جدید تنظیم می‌شوند. .IP \(bu فهرست رأس‌های فعلی بازنشانی می‌شود. .sp با این حال، این دستور به بافر عمق دست نمی‌زند: آن را به همان صورتی که قبل از اجرای دستور بود رها می‌کند. همچنین حالت رسم بدون تغییر باقی می‌ماند (مثلاً اگر \fBpamtris\fP در حالت FAN بود، در همان حالت ادامه می‌دهد و غیره). .sp اگر این دستور با مقداری نامعتبر برای \fImaxval\fP یا \fInum_attribs\fP داده شود، نادیده گرفته می‌شود و بنابراین هیچ‌یک از اثرات جانبی فوق اعمال نمی‌شوند و maxval، num_attribs یا tupletype فعلی نیز به هیچ وجه تغییر نمی‌کنند. .sp مجاز است مقداری برای \fImaxval\fP و \fInum_attribs\fP برابر با مقادیر فعلی آن‌ها داده شود، اگرچه حتی در چنین حالتی نیز اثرات جانبی فوق اعمال خواهند شد. .sp از آنجا که این دستور با تخصیص حافظه سروکار دارد، ممکن است در اجرا با شکست مواجه شود. اگر این اتفاق بیفتد، دیگر هیچ سطری از ورودی خوانده نخواهد شد و \fBpamtris\fP به گونه‌ای خاتمه می‌یابد که گویی دستور \fBquit\fP صادر شده است. .TP \fBquit\fP .sp این دستور موجب خروج از \fBpamtris\fP می‌شود. پس از این دستور، هیچ سطر ورودی دیگری خوانده نخواهد شد. .UN tips .SH "نکات (TIPS)" .SS "بافت‌دهی (Texturing)" .PP می‌توان اصطلاحاً «بافت‌ها» (textures) را بر روی تصاویر تولیدشده با \fBpamtris\fP اعمال کرد؛ این کار با استفاده از یک جفت مشخصه رأس به عنوان مختصات بافت، سپس استفاده از .BR "\fBpamchannel\fP" (1)\c \& برای انتخاب کانال‌های مناسب در تصویر(های) خروجی، و در نهایت پردازش نتیجه از طریق .BR "\fBpamlookup\fP" (1)\c \& با ارائه فایل بافت مورد نظر به عنوان یک جدول جستجو (lookup table) انجام‌پذیر است. اگر تصاویری با پرسپکتیو رسم می‌کنید، حتماً مقادیر مناسبی برای پارامتر \fIw\fP در دستورات vertex خود ارائه دهید ( .UR #cmd_vertex به بالا مراجعه کنید .UE \&) تا نمونه‌های حاصل در تصاویر تولیدی \fBpamtris\fP از نظر پرسپکتیو صحیح باشند. همچنین ممکن است بخواهید از .BR "\fBpnmtile\fP" (1)\c \& برای ساخت بافت‌هایی استفاده کنید که قرار است در امتداد شبکه‌های مثلثی تکرار شوند. .PP تصویر متحرک GIF زیر نمونه‌ای از دستاوردی است که می‌توان با استفاده از روش فوق به دست آورد (بافت زمین برگرفته از .UR https://visibleearth.nasa.gov/view.php?id=73580 nasa.gov .UE \&): .PP .B چرخش زمین .IMG -C pamtris_earth.gif .UN antialias .SS "لبه‌های صاف‌شده (Anti-aliased edges)" .PP برنامه \fBpamtris\fP به خودی خود هیچ‌گونه صاف‌سازی لبه‌ها (anti-aliasing) روی لبه‌های مثلث انجام نمی‌دهد. با این حال، می‌توان از طریق روش «نمونه‌برداری فراتر» (super-sampling) به تصاویر صاف‌شده دست یافت: تصویر(های) خود را در اندازه‌ای بزرگ‌تر از اندازه نهایی مورد نظر رسم کنید، و سپس هنگامی که تمام پس‌پردازش‌ها انجام شد، تصویر(های) نهایی را به اندازه دلخواه کوچک نمایید. رسم تصاویر با دو برابر عرض و ارتفاع مورد نظر، و سپس کوچک کردن آن‌ها به اندازه مورد نظر بدون در نظر گرفتن گاما (یعنی کاری که \fBpamscale\ -linear\fP انجام می‌دهد) اغلب نتایج به اندازه کافی خوبی ایجاد می‌کند؛ اما هرچه نسبت \fI "اندازه\ تصویر\ اصلی"\ /\ "اندازه\ تصویر\ کوچک‌شده" \fP بزرگ‌تر باشد، کیفیت اثر صاف‌سازی لبه‌ها بهتر خواهد بود. .UN seealso .SH "همچنین ببینید (SEE ALSO)" .BR "pampick" (1)\c \& .BR "pamchannel" (1)\c \& .BR "pamstack" (1)\c \& .BR "pamlookup" (1)\c \& .BR "pamarith" (1)\c \& .BR "pamscale" (1)\c \& .BR "pamdepth" (1)\c \& .BR "pamexec" (1)\c \& .BR "pam" (1)\c \& .UN history .SH "تاریخچه (HISTORY)" .PP برنامه \fBpamtris\fP در Netpbm 10.84 (سپتامبر 2018) معرفی شد. .SH "منبع مستندات (DOCUMENT SOURCE)" این صفحه راهنما توسط ابزار Netpbm تحت عنوان 'makeman' از منبع HTML تولید شده است. مستندات اصلی در آدرس زیر قرار دارد: .IP .B http://netpbm.sourceforge.net/doc/pamtris.html .PP