الرسوم المتحركة في Asymptote

تم نسخها من مدونتي لإنشاء مصدر معلومات باللغة الروسية حول هذا الموضوع.

أهلا وسهلا بك! عندما كنت في عملية اتقان برنامج Asymptote ، الذي حدث عندما تعلمت الفروق الدقيقة في إعدادات هذا البرنامج الموصوفة هنا في هذا المحور ، أتقنت معالجة معالجة ملفات .asy التي لا تحتوي على رسوم متحركة بشكلٍ طبيعي ، فقد واجهت الرسوم المتحركة بشكل طبيعي.

المفسد العنوان
إعطاء الرسوم المتحركة للجماهير!

لحسن الحظ ، لهذا ، في حالة تنسيق الإخراج .pdf ، لا يوجد أي من البرامج الإضافية التي وصفتها في لوحة الوصل باستخدام الرابط أعلاه ، بعد تثبيت برنامج ghostscript ، لست بحاجة إلى التثبيت ، وحتى الشيطان يعرف كم من الوقت كان يتم الحفر. ولكن بعد ذلك لم أكن أعرف ذلك ، الأمر الذي أدى إلى تعقيد الأمر عدة مرات. قمت بمعالجة الملف wheel.asy وماذا؟ حسنًا ، ظهر .pdf أثناء المعالجة في TeXworks (انظر الرابط المذكور أعلاه) في نفس المجلد مع ملف .asy المعالج ، وعند فتحه في Explorer (انظر نفس المحور) ، في المجلد C:\Windows\System32 . ماذا بعد؟ لم يكن هناك رسم متحرك فيه وهذا كل شيء ، على الرغم من أنه يمكنك التصدع. قبل الرسوم المتحركة في Asymptote ، تعلمت كيفية صنع الرسوم المتحركة في tikz و pstricks . لذلك لم أفلح في ذلك حتى قمت بحذف الملف animate.sty من المجلد C:\Program Files\MiKTeX 2.9\tex\latex\animate ووضع الملف بنفس الاسم الذي تم تنزيله لاحقًا. ها هو ذا . وهكذا ، مع العلم أن هذا تعمل الحزمة مع tikz و pstricks ، كنت أميل إلى الاعتقاد بأن ذلك لا ينجح بالنسبة لي ، على الأرجح ، ليس بسبب مشاكل مع TeX ، ولكن لسبب آخر. لذا فتشت الإنترنت القديم لعدة سنوات. في البداية بحثت في متصفح IE ، حسناً ، لا يوجد مترجم مناسب هناك. ثم استنشقت أن جوجل لديها مترجم مناسب فيه. بحثت أيضًا ، فتشت ، فتشت ، فتشت ، حتى صادف هذه الصفحة. اتضح أنه لسبب ما في جميع ملفات .asy من المجلد C:\Program Files\Asymptote\examples\animations ، للحصول عليها .pdf مع الرسوم المتحركة ، لا يوجد سطر واحد كافي

 settings.twice=true; 

أضفت هذا الخط إلى ملف wheel.asy من مجلد الرسوم المتحركة الفرعي لمجلد الأمثلة:

وأخيرا الرسوم المتحركة !!!!!!!
 import graph; // Uncomment the following 2 lines to support pdf animations: usepackage("animate"); settings.tex="pdflatex"; settings.twice=true; import animation; size(0,200); defaultpen(3); dotfactor=4; pair wheelpoint(real t) { return (t+cos(t),-sin(t)); } guide wheel(guide g=nullpath, real a, real b, int n) { real width=(ba)/n; for(int i=0; i <= n; ++i) { real t=a+width*i; g=g--wheelpoint(t); } return g; } real t1=0; real t2=t1+2*pi; animation a; draw(circle((0,0),1)); draw(wheel(t1,t2,100),linetype("0 2")); yequals(Label("$y=-1$",1.0),-1,extend=true,linetype("4 4")); xaxis(Label("$x$",align=3SW),0); yaxis("$y$",0,1.2); pair z1=wheelpoint(t1); pair z2=wheelpoint(t2); dot(z1); dot(z2); int n=10; real dt=(t2-t1)/n; for(int i=0; i <= n; ++i) { save(); real t=t1+dt*i; draw(circle((t,0),1),red); dot(wheelpoint(t)); a.add(); // Add currentpicture to animation. restore(); } erase(); // Merge the images into a gif animation. //a.movie(BBox(0.25cm),loops=10,delay=250); // Merge the images into a pdf animation. label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false)); 


في الوقت نفسه ، من أجل الحصول على .pdf ، ومعرفة 300 كلمة باللغة الإنجليزية ، أدركت أنني بحاجة إلى عدم الإزعاج في شكل ملف wheel.asy الذي يحصل عليه المستخدم من مؤلفي (مؤلفي) برنامج Asymptote ، سطرين:

 ....................... usepackage("animate"); settings.tex="pdflatex"; ....................... 

النظر في التعليقات على هذه السطور في نهاية ملف wheel.asy:

 ........................ // Merge the images into a gif animation. a.movie(BBox(0.25cm),loops=10,delay=250); // Merge the images into a pdf animation. // label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false)); 

، أدركت أنه للحصول على .pdf ، أحتاج إلى إعادة الرمز الذي حصلت عليه من مؤلفي البرنامج والتعليق على السطر

 a.movie(BBox(0.25cm),loops=10,delay=250); 

، و uncomment الخط

 label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false)); 

وكيف تدحرجت العجلة بعد حركات الجسد هذه! منطق مؤلفي برنامج Asymptote غير مفهوم أيضًا: للحصول على .gif هناك حاجة إلى برنامج إضافي واحد أكثر من الحصول على .pdf. من المرجح أن يشاهد المستخدمون الذين لا يعرفون كيفية القيام بذلك على الإطلاق الملفات التي تحتوي على أمثلة. حسنًا ، قم بذلك حتى عند فتح هذه الملفات في وقت واحد ، دون تغيير أي شيء فيها ، يمكن لهؤلاء المستخدمين تلقي تنسيق يتطلب برامج إضافية أقل - .pdf ، لا ، قاموا بإنشائها .gif. لماذا ؟؟ حسنا حسنا. نعم ، سألاحظ أيضًا أنه عند فتح ملف wheel.asy في Explorer (انظر لوحة الوصل الخاصة بي ) للحصول على عمل. gif منه ، يكون وجود ملف config.asy في نفس المجلد به (انظر لوحة الوصل الخاصة بي ) اختياريًا. واسمحوا لي أن أذكرك بأن .gif في هذه الحالة (عند فتحه في Explorer) قد تم تشكيله في المجلد C:\Windows\System32 . عند معالجة ملف .asy في TeXworks ، يكون وجود config.asy في نفس المجلد مثل الملف المراد معالجته إلزاميًا (أو بما في ذلك الخطوط التي وصفتها في الرابط السابق مباشرةً في ملف .asy المعالج نفسه). حسنا ، ها هو ذا. حصلت على هذه عجلة المتداول مستقيم ، ضحكت في كل مكان ، مسرور. كان الليل. ذهبت الى السرير. استيقظت وشركات. أثناء تشغيل الكمبيوتر ، جلس وهو يفرك يديه. حسنًا ، أعتقد ، الآن سأبدأ حسابي في استخدام زيت الوقود بالنسبة لنا.) نعم الآن. نجحت الرسوم المتحركة من مجلد فرعي من الأمثلة عمليا كل شيء ، باستثناء embeddedmovie.asy ، externalmovie.asy و embeddedu3d.asy. لقد انتظرت الملفين الأولين لاحقًا ، لكنها لم تعمل مع الملف الأخير: هناك ، كما أفهمها ، هناك حاجة إلى تنزيل ملف dice.u3d بشكل إضافي من مكان ما ، والذي يعد سرًا كبيرًا لشركة صغيرة. حسنًا ، "أوه ، المملكة ليست كافية ، لا يوجد مكان للتجول". كتبت ، كان هناك مثل هذا الرمز:

 settings.twice=true; usepackage("animate"); import solids; settings.tex="pdflatex"; import animation; settings.outformat="pdf"; settings.axes3=true; import graph3; import palette; currentprojection=orthographic(1,1,1); limits((-1.3,-1.3,-1.3),(1.3,1.3,1.3)); unitsize(6cm); animation a; int n=44; for(int i=0; i<=n; ++i){ real g(real x) {return sqrt(1-x^2);} pair G(real x) {return (x,g(x));} triple G3(real x) {return (x,g(x),0);} path q=graph(G,1-i/n,1); path3 q3=path3(q); revolution c=revolution(q3,X,0,360); draw(surface(c),red); real f(real x) {return sqrt(1-x^2);} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,-1,-1+i/n); path3 p3=path3(p); revolution b=revolution(p3,X,0,360); draw(surface(b),green); axes3("$x$","$y$","$z$",Arrow3); a.add(); restore(); } erase(); label(a.pdf("controls,loop",delay=1000)); 

تلقيت الخطأ الواعد التالي في TeXworks :

 error: out of memory 

عند فتح هذا الملف .asy في Explorer (انظر الرابط إلى المحور أعلاه) ، كان الخطأ هو نفسه. نعم. لقد البخار ، لقد البخار ، لقد عكرت ، وجدت ذلك عندما ن=3دولارااتضح .pdf مع الرسوم المتحركة ، ولكن بالفعل في ن=4دولاراأن هذا الخطأ ينشأ أيضا. اسمحوا لي أن أسأل في منتدى Asymptote نفسه . لكن الأنجلوسكسونيين هم أشخاص يحترمون القانون ولا يرغبون في التراجع عن التعليمات. لم يأتوا بأي شيء. ما يجب القيام به هل كان الأمر يستحق مجرفة نصف الإنترنت للتعثر على هذه القمامة؟ حسنًا ، لا شيء ، الروس لا يستسلمون! وإلى جانب ذلك ، يتجول الأبطال العاديون دائمًا ... بدأت في مراقبة عملية معالجة ملف wheel.asy في TeXworks وماذا رأيت؟ أولاً ، تظهر الملفات _wheel + 0.pdf ، _wheel + 1.pdf ، ... ، _wheel + 10.pdf ، ثم من هذه الملفات ، يتم إنشاء ملف متعدد الصفحات _wheel.pdf ومزيد من البرنامج. وللقيام بكل هذا ، يتم استيراد وحدة الرسوم المتحركة في ملف .asy الذي سيحصلون منه على الرسوم المتحركة . ثم كان لدي فكرة. ولكن ماذا لو وجدت في هذه الوحدة (ملف C:\Program Files\Asymptote\animation.asy ) مكانًا يولد ملفات مثل _wheel + 0.pdf وإيقافه؟ هل تقوم بختم هذه الملفات باستخدام Asymptote وتجهيز الملفات .asy التي تم إنشاؤها بواسطة الاسترجاع في ملف دفعي؟ يمكن إنشاء هذه الملفات .asy باستخدام اسم الأسماء + 0.asy ، والاسم + 1.asy ، وما إلى ذلك ، طالما كان ذلك ضروريًا. حيث يكون الاسم عبارة عن مجموعة من الأحرف اللاتينية المرتبطة بالرسوم المتحركة التي يتم إنشاؤها ، والتي من المرجح أن ترغب في تغييرها في ملف pdf جاهز مع الرسوم المتحركة. ولكن سيكون في وقت لاحق. في غضون ذلك ، بعد إنشاء الملفات ، يكون الاسم هو + 0.asy ، والاسم هو + 1.asy ... وفقًا لفكرتي ، يجب اتباع المعالجة بواسطة Asymptote. هذا من شأنه أن يخلق اسم الملفات + 0.pdf ، الاسم + 1.pdf ... وقبل الكود الذي ينشئ اسم الملفات + 0.asy ، الاسم + 1.asy ... ، اضطررت إلى إدراج سطور في الملف الدفعي لإنشاء اسم الملف. أو بالأحرى ، فقط أسطر للدخول في هذا الملف. وسيتم تشكيل ملف name.asy ببساطة كنتيجة للملف الدفعي. في هذا الملف ، الاسم هو .asy ، كنت أخطط لاستيراد وحدة الرسوم المتحركة التي قمت بتحويلها بدلاً من وحدة الرسوم المتحركة نفسها. قررت أن أجعل بداية اسم الملف هو أسهل. بروح بداية الملف wheel.asy. بعد الحلقة ، قمت فقط بنسخ الأسطر بغباء من هذا الملف ولصقها في ملف الدُفعات كما يلي:

 echo  >> .asy 

.

 echo  >> .asy 

كتبت الملف الدفعي بحيث يكون الاسم في الملف الذي تم إنشاؤه سهلًا ، وكان نص الحلقة فارغًا ، ومن أين كان ، سيظهر الأمر كما يلي:

 for(int i=0; i <= n; ++i) { 

في الملف الدفعي ، السطر الموجود أعلى سطر الشفرة الذي يدخل هذا السطر في اسم الملف. easy هو سطر

 echo int n=%n%; >>%name%.asy 

والسطر الثالث والرابع من هذا الملف الدفعي:
 set n=24 set name=OdnopGip 

، لذلك من خلال بداية معالجة الحلقة في اسم الملف ، يعرف Easy Asymptote بالفعل قيمة n في هذه الحالة ويعمل كل شيء. اسم متغير البيئة يعني ، في الترجمة إلى لغة هذه المقالة ، الاسم من name.asy . في هذه الحالة ، يبدو لي أن الإعلان عن قيم الاسم أو n في ملف الدُفعات عبر المجموعة أمر مريح للغاية: تغيير قيمها في مكان واحد فقط في ملف الدُفعات يستلزم تغيير جميع أسماء ملفات .tex أو .pdf التي يتم إنشاؤها عند معالجة ملف أو رقم .asy معين إطارات في قوات الدفاع الشعبي الناتجة الرسوم المتحركة ، وتغيير أساسا تفاصيل الرسوم المتحركة. حسنا ، ها هو ذا. لذلك قمت بإعداد اسم الإطارات + 0.pdf ، name + 1.pdf ... ، ومع ذلك ، لأنه بعد فتح كل إطار تم فتحه ، اضطررت إلى تضمين أمر في ملف الدُفعات لإغلاقه. نظرًا لأنني لم أكن أعرف كيفية إغلاق نافذة بعنوان محدد من ملف دفعي ، فقد أدرجت الأمر التالي في ملف الدُفعات الخاص بي في نص دورة المعالجة فارغة الإطار .asy:
 taskkill /IM AcroRd32.exe 

، كما اتضح فيما بعد في عملية تشغيل كل هذا ، هو أفضل من إغلاق كل إطار محدد: في بعض الأحيان لا يكون للإطار الوقت الكافي للظهور على الشاشة ، ولكن تبدأ معالجة ملف .asy التالي ، وفي النهاية يظهر الإطار التالي على الشاشة ، والنهاية باستخدام أمر هذه الخطوة التالية من الدورة ، سيتم إغلاق كل من الإطار من هذه الخطوة التالية وإطار الخطوة السابقة ، بعد أن تم تشغيل ملف الدُفعات قيد التشغيل ، على الرغم من أنه من الواضح أنه بعد تضمين هذا الأمر في ملف الدُفعات أثناء تنفيذه للكتاب في .pdf ، فإنه لم يعد أنا سيء ، نعم. علاوة على المنطق ، كنت بحاجة إلى إعادة تسمية اسم الملفات + 0.asy ، name + 1.asy ، ... إلى _name + 0.asy ، _name + 1.asy ، ... ، نظرًا لوجود ملفات لها هذه الأسماء تمامًا في واحد يتضمن المجلد الذي يحتوي على ملف .asy ، والذي توجد فيه رسوم متحركة ، معالجة هذا الملف شريطة أن يتم استيراد وحدة الرسوم المتحركة الأصلية قبل البدء في إنتاج ملف name.pdf (نعم ، يمكنني إدراج سطور من التعليمات البرمجية التي تشكل الإطار داخل ملف الدُفعات مع متغير k لا اسم الملف + k.asy ، والملف _name + k.asy ، لكن هذا سيتطلب إدخالًا أكبر للحرف "_". ومعالجة إضافية للجروح المقاربة وكان ملف E خلق imya.asy باختصار، وفقا لالفكرة الأصلية أن يكون ملف دفعي يبدو مثل هذا:

 cd /d %0\.. echo off set n=99 set name=cvetok echo settings.twice=true; > %name%.asy echo usepackage("animate"); >>%name%.asy echo settings.tex="pdflatex"; >>%name%.asy echo import izgraphiki; >>%name%.asy echo animation a; >>%name%.asy echo int n=%n%; >>%name%.asy echo for(int i=0; i ^<= n; ++i) { >>%name%.asy echo a.add(); >>%name%.asy echo restore(); >>%name%.asy echo } >>%name%.asy echo erase(); >>%name%.asy echo label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false)); >>%name%.asy for /l %%k in (0,1,%n%) do ( echo import graph; >> %name%+%%k.asy echo settings.tex="pdflatex"; >> %name%+%%k.asy echo limits((-1.2,-1.2^),(1.2,1.2^)^); >> %name%+%%k.asy echo size(0,100^); >> %name%+%%k.asy echo real f(real t^) {return cos(2*t^);} >> %name%+%%k.asy echo path g=polargraph(f,0,2pi*%%k/%n%,operator ..^)--cycle; >> %name%+%%k.asy echo fill(g,green+white^); >> %name%+%%k.asy echo xaxis("$x$",above=true^); >> %name%+%%k.asy echo yaxis("$y$",above=true^); >> %name%+%%k.asy echo draw(g^); >> %name%+%%k.asy ) for /l %%l in (0,1,%n%) do ( asy %name%+%%l.asy taskkill /IM AcroRd32.exe ) for /l %%l in (0,1,%n%) do ( rename %name%+%%l.pdf _%name%+%%l.pdf ) asy %name%.asy 

هنا نرى أنني أستورد وحدة الرسوم المتحركة. أعطيت الاسم العادي izgraphiki.asy لهذه الوحدة. وبالنسبة إلى ملف .pdf للرسوم المتحركة الذي أحصل عليه ، لم أجد اسمًا أفضل من cvetok. على ما يبدو ، بسبب ندرة خياله. حسنا ، هيا ، كيف هو. سأخبرك عن وحدة "izgraphiki.asy" الخاصة بي في نهاية هذه القصة ، حتى لا تفقد سلسلة الأخبار الآن ، لكن الآن سأحاول أن أحاول إعطاء هذا الملف اسم iz-graphiki.asy ، ثم جرب أيضًا iz + graphiki.asy لم يؤدي إلى الهدف المقصود: توقف عمل ملف الدُفعات الخاص بي على قدم وساق ولم يستأنف تحت أي ظرف من الظروف. على ما يبدو ، يجب أن تحتوي الوحدات النمطية لبرنامج Asymptote فقط على حروف الأبجدية اللاتينية. في أي حال ، فإن الامتثال لهذا الشرط بالتأكيد لن يضر. لذلك ، انتهى عمل ملف الدُفعات الذي أشرت إليه أعلاه مع ظهور ملف .pdf مرغوب فيه مع رسم متحرك من ملف كبير بشكل تعسفي (من أجل عدم الانتظار لثلاث ساعات ، إنه يعمل ، يظهر ملف .pdf المتحرك ، كل شيء على ما يرام ، لكن الكمبيوتر لديه سرعة العمليات نهائية فقط). اسمحوا لي أن تفعل بناء الرسوم المتحركة من الكائنات 3D. ثم أصبحت مشاكل أخرى واضحة. تمكنت من ختم الطلقات بهذه الأشياء ، لكن ، هذا كل شيء. في هذه الإطارات ، تبين أن هذه الكائنات تدور في الفضاء ، كل شيء على ما يرام هنا ، ولكن فقط بسبب وجود وحدة التخزين هذه في إطارات pdf ، لا يمكن استخدامها لإنشاء إطارات بتنسيق pdf مع الرسوم المتحركة. دعني أفكر أكثر. مشاهدة معالجة ملف sphere.asy المعدل قليلاً:

ملف sphere.asy المعدل قليلا
 settings.twice=true; usepackage("animate"); import solids; settings.tex="pdflatex"; import animation; settings.outformat="pdf"; currentprojection=orthographic((0,5,2)); currentlight=(0,5,5); int nbpts=200; real step=2*pi/nbpts; int angle=90; unitsize(1cm); triple[] P=new triple[nbpts]; for(int i=0; i < nbpts; ++i) { real t=-pi+i*step; P[i]=(3sin(t)*cos(2t),3sin(t)*sin(2t),3cos(t)); } transform3 t=rotate(angle,(0,0,0),(1,0.25,0.25)); revolution r=sphere(O,3); draw(surface(r),lightgrey); draw(r,backpen=linetype("8 8",8)); animation A; for(int phi=0; phi < 360; phi += angle) { bool[] front=new bool[nbpts]; save(); for(int i=0; i < nbpts; ++i) { P[i]=t*P[i]; front[i]=dot(P[i],currentprojection.camera) > 0; } draw(segment(P,front,operator ..),1mm+blue+extendcap); draw(segment(P,!front,operator ..),grey); A.add(); restore(); } label(A.pdf()); 


، لاحظت أنه خلال هذه المعالجة ، تظهر جميع إطارات الرسوم المتحركة ولا تختفي بالتتابع ، ولكن فقط ، إذا جاز لي أن أقول ذلك ، في الإصدار الثاني: في رأيي ، هذه رسومات ثلاثية الأبعاد كاملة ، ولكن إذا حاولت مشاهدتها من جوانب مختلفة في نافذة عارض Abode قارئ من خلال الانتقال مع الضغط على زر الماوس الأيسر ، كما هو متوقع من الرسومات ثلاثية الأبعاد التي تم الحصول عليها باستخدام Asymptote ، ما لم يتم إيقاف تشغيل هذا الاعتبار عن قصد قبل بدء إنتاج .pdf مع الرسوم المتحركة في ملف .asy ، فقد أصبح هذا مستحيلًا عشر. أسماء هذه الإطارات ثنائية الأبعاد: _sphere + 0.pdf ، _sphere + 1.pdf ، ... بعد أن تعلمت حول إنشاء الإطارات ثنائية الأبعاد المكانية عند معالجة ملفات .asy التي تحتوي على رسوم متحركة للكائنات ثلاثية الأبعاد ، حدث لي الحصول على إطارات .pdf من ملف دفعي لمزيد من الاستخدام في معالجة ملف .asy ، حيث توجد دورة ذات نص فارغ ، والتي أقوم بإنشائها في بداية الملف الدفعي ، ليس فقط معالجة ملفات .asy ، ولكن معالجة ملفات .asy ، ولكل منها دورة. هذه الحلقات في كل من هذه الروافع ملف .asy لتلقي إطار .pdf منه تتكون من إطار واحد: أنا لم تجعل هذه الرهانات للحصول على .pdf مع الرسوم المتحركة منها ، ولكن للحصول على إطار 2D ، بالمناسبة في عملية معالجة كل من ملف كعب الروتين .asy. من أجل تلقي ملفات .asy فارغة باستخدام هذه الحلقات ، قمت بعملها بحيث في متغيرات جميع الملفات الفارغة .asy ، تأخذ متغيرات هذه الحلقات في بداية ونهاية الحلقات نفس القيمة - 0. الاختلافات بين إطارات .pdf الناتجة عن المعالجة تشغيل Asymptote من الملفات الفارغة. تشي Kla ، بأخذ قيمته التالية ، يتجمد ، في انتظار الانتهاء من إنشاء ملف المشتريات. easy ، المقابلة لهذه القيمة لمتغير حلقة ملف الدُفعات. باختصار ، يتم إنشاء هذه الاختلافات بواسطة متغير حلقة ملف دفعي. أسماء هذه الإطارات ثنائية الأبعاد من النموذج: name + k + 0.pdf ، حيث ، لأن هذه الإطارات ثنائية الأبعاد هي نتيجة تغيير في متغير حلقة ملف الدُفعات ، كتأخذ القيم من 0 إلى القيمة النهائية لمتغير حلقة ملف الدُفعات مع الخطوة 1. للحصول على .pdf المتحركة من ملف .asy مع النص الفارغ للحلقة التي تم إنشاؤها بواسطة ملف الدُفعات مسبقًا ، يجب أن يكون لأسماء إطارات .pdf النموذج التالي: _name + k.pdf. لذلك ، الفريق التالي في الملف الدفعي قمت بإعادة تسمية هذه الإطارات .pdf. لقد فعلت ذلك في حلقة. وأخيرًا ، يدير فريق المعالجة ملف Asymptote .asy بهيكل حلقة فارغ. بعد هذه المعالجة ، يظهر .pdf مع الرسوم المتحركة. في الملف الدفعي ، بعد هذا الأمر ، لم أكتب أمرًا لفتح ملف .pdf مع الرسوم المتحركة ، لأن هذا الافتراض مفترض افتراضيًا ، يتم فتح ملف .pdf مع الرسوم المتحركة على أي حال في نهاية هذه المعالجة ، تمامًا مثل فتح ملف .pdf تم إنشاؤها بواسطة Asymptote معالجة ملف .asy بدون رسوم متحركة. إذا لاحظ القارئ عملية معالجة ملفات .asy من مجلد فرعي يتضمن رسومًا متحركة لمجلد الأمثلة الموجود في مجلد برنامج Asymptote ، فسوف يتفهم أن جزءًا من الاسم من _name + k.pdf يجب أن يتزامن مع اسم ملف .asy مع نص فارغ من الحلقة. الملفات _name + k.pdf هي نتيجة إعادة تسمية بعض ملفات .pdf الأخرى (اسم الملفات + k + 0.pdf) ، والتي هي بدورها نتاج ثانوي للبرنامج الذي يعالج بعض ملفات .asy ، وبالتالي ، لتبسيط المهمة ، قمت بهذه الملفات تم إنشاء .asy بواسطة ملف دفعي تحت اسم الأسماء + 0.asy ، name + 1.asy ، ... حسنًا ، لقد وصفت مبدأ عمل ملف دفعي الذي خططت له ، لقد حان الوقت لإعطاء مثال على أحد ملفات الدُفعات هذه. على سبيل المثال ، هذا:

 cd /d %0\.. echo off set n=44 echo settings.twice=true; >>sphera.asy echo usepackage("animate"); >>sphera.asy echo settings.tex="pdflatex"; >>sphera.asy echo import izgraphiki; >>sphera.asy echo animation a; >>sphera.asy echo int n=%n%; >>sphera.asy echo for(int i=0; i ^<= n; ++i) { >>sphera.asy echo a.add(); >>sphera.asy echo restore(); >>sphera.asy echo } >>sphera.asy echo erase(); >>sphera.asy echo label(a.pdf(BBox(0.25cm),delay=250,"controls,loop,autoplay",multipage=false)); >>sphera.asy for /l %%k in (0,1,%n%) do ( echo settings.twice=true; >> sphera+%%k.asy echo usepackage("animate"^); >> sphera+%%k.asy echo import solids; >> sphera+%%k.asy echo settings.tex="pdflatex"; >> sphera+%%k.asy echo import animation; >> sphera+%%k.asy echo settings.outformat="pdf"; >> sphera+%%k.asy echo settings.axes3=true; >> sphera+%%k.asy echo import graph3; >> sphera+%%k.asy echo import palette; >> sphera+%%k.asy echo currentprojection=orthographic(1,1,1^); >> sphera+%%k.asy echo limits((-1.3,-1.3,-1.3^),(1.3,1.3,1.3^)^); >> sphera+%%k.asy echo unitsize(6cm^); >> sphera+%%k.asy echo animation a=animation(global=false^); //  (global=false^)   >>sphera+%%k.asy echo //C:\Program Files\Asymptote/plain_shipout.asy: 87.10: runtime: Cannot rename _sphera+2+0_.pdf to >>sphera+%%k.asy echo //_sphera+2+0.pdf >>sphera+%%k.asy echo for(int i=0; i ^<= 0; ++i^) { >>sphera+%%k.asy echo real f(real x^) {return sqrt(1-x^^2^);} >> sphera+%%k.asy echo pair F(real x^) {return (x,f(x^)^);} >> sphera+%%k.asy echo triple F3(real x^) {return (x,f(x^),0^);} >> sphera+%%k.asy echo path p=graph(F,-1+i,-1+i+%%k/%n%^); >> sphera+%%k.asy echo path3 p3=path3(p^); >> sphera+%%k.asy echo revolution b=revolution(p3,X,0,360^); >> sphera+%%k.asy echo draw(surface(b^),green^); >> sphera+%%k.asy echo real g(real x^) {return sqrt(1-x^^2^);} >> sphera+%%k.asy echo pair G(real x^) {return (x,f(x^)^);} >> sphera+%%k.asy echo triple G3(real x^) {return (x,g(x^),0^);} >> sphera+%%k.asy echo path q=graph(G,1-i-%%k/%n%,1-i^); >> sphera+%%k.asy echo path3 q3=path3(q^); >> sphera+%%k.asy echo revolution c=revolution(q3,X,0,360^); >> sphera+%%k.asy echo draw(surface(c^),red^); >> sphera+%%k.asy echo axes3("$x$","$y$","$z$",Arrow3^); >> sphera+%%k.asy echo a.add(^); >>sphera+%%k.asy echo restore(^); >>sphera+%%k.asy echo } >>sphera+%%k.asy echo erase(^); >>sphera+%%k.asy echo label(a.pdf(^)^); >>sphera+%%k.asy ) rem for /f %%l in (0,1,%n%) do asy '_sphera+%%l'.asy for /l %%l in (0,1,%n%) do ( asy sphera+%%l.asy taskkill /F /IM AcroRd32.exe ) for /l %%l in (0,1,%n%) do rename sphera+%%l+0.pdf _sphera+%%l.pdf asy sphera.asy 

يرجى الانتباه إلى الخط

 echo for(int i=0; i ^<= n; ++i) { >>sphera.asy 

نظرًا لأن الرمز < له معنى خاص لمترجم سطر الأوامر ، ولكي يأخذ هذا المترجم هذا الرمز بالمعنى الحرفي ، نجوت من هذا الرمز بوضع الرمز ^ أمامه. ^ , . , , ,

 for /l %%k in (0,1,%n%) do ( 

, , . ( , , sphera.asy :

 settings.twice=true; usepackage("animate"); settings.tex="pdflatex"; import izgraphiki; animation a; int n=44; for(int i=0; i <= n; ++i) { a.add(); restore(); } erase(); label(a.pdf(BBox(0.25cm),delay=250,"controls,loop,autoplay",multipage=false)); 

sphera+0.asy, sphera+1.asy,..., sphera+44.asy, Asymptote 2d- sphera+0.pdf, sphera+1.pdf,..., sphera+44.pdf. , sphera+4.asy :

 settings.twice=true; usepackage("animate"); import solids; settings.tex="pdflatex"; import animation; settings.outformat="pdf"; settings.axes3=true; import graph3; import palette; currentprojection=orthographic(1,1,1); limits((-1.3,-1.3,-1.3),(1.3,1.3,1.3)); unitsize(6cm); animation a=animation(global=false); //          (global                  //C:\Program Files\Asymptote/plain_shipout.asy: 87.10: runtime: Cannot rename _sphera+2+0_.pdf to //_sphera+2+0.pdf for(int i=0; i <= 0; ++i) { real f(real x) {return sqrt(1-x^2);} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,-1+i,-1+i+4/44); path3 p3=path3(p); revolution b=revolution(p3,X,0,360); draw(surface(b),green); real g(real x) {return sqrt(1-x^2);} pair G(real x) {return (x,f(x));} triple G3(real x) {return (x,g(x),0);} path q=graph(G,1-i-4/44,1-i); path3 q3=path3(q); revolution c=revolution(q3,X,0,360); draw(surface(c),red); axes3("$x$","$y$","$z$",Arrow3); a.add(); restore(); } erase(); label(a.pdf()); 

, sphera+4.asy TeXworks', UTF-8:

صورة

ANSI. , - .asy, , , Asymptote. 2d- . 2d-, , , 2d-. - .asy , . 2d- sphera+0+0.pdf, sphera+1+0.pdf,..., sphera+44+0.pdf _sphera+0.pdf, _sphera+1.pdf,..., _sphera+44.pdf, , , Asymptote sphera.asy. . .gif , .gif - . .gif, .pdf , , , , . ., , .pdf , .gif . .gif , :

 cd /d %0\.. echo off set n=44 echo import graph; >sphera.asy echo settings.twice=true; >>sphera.asy echo usepackage("animate"); >>sphera.asy echo settings.tex="pdflatex"; >>sphera.asy echo import izgraphikigif; >>sphera.asy echo animation a; >>sphera.asy echo yequals(Label("$y=-1$",1.0),-1,extend=true,linetype("4 4")); >>sphera.asy echo int n=%n%; >>sphera.asy echo for(int i=0; i ^<= n; ++i) { >>sphera.asy echo a.add(); >>sphera.asy echo restore(); >>sphera.asy echo } >>sphera.asy echo erase(); >>sphera.asy echo a.movie(); >>sphera.asy for /l %%k in (0,1,%n%) do ( echo settings.twice=true; > sphera+%%k.asy echo usepackage("animate"^); >> sphera+%%k.asy echo import solids; >> sphera+%%k.asy echo settings.tex="pdflatex"; >> sphera+%%k.asy echo import animation; >> sphera+%%k.asy echo settings.outformat="pdf"; >> sphera+%%k.asy echo settings.axes3=true; >> sphera+%%k.asy echo import graph3; >> sphera+%%k.asy echo import palette; >> sphera+%%k.asy echo currentprojection=orthographic(1,1,1^); >> sphera+%%k.asy echo limits((-1.3,-1.3,-1.3^),(1.3,1.3,1.3^)^); >> sphera+%%k.asy echo unitsize(6cm^); >> sphera+%%k.asy echo animation a=animation(global=false^); //  (global=false^)   >>sphera+%%k.asy echo //C:\Program Files\Asymptote/plain_shipout.asy: 87.10: runtime: Cannot rename _sphera+2+0_.pdf to >>sphera+%%k.asy echo //_sphera+2+0.pdf >>sphera+%%k.asy echo for(int i=0; i ^<= 0; ++i^) { >>sphera+%%k.asy echo real f(real x^) {return sqrt(1-x^^2^);} >> sphera+%%k.asy echo pair F(real x^) {return (x,f(x^)^);} >> sphera+%%k.asy echo triple F3(real x^) {return (x,f(x^),0^);} >> sphera+%%k.asy echo path p=graph(F,-1+i,-1+i+%%k/%n%^); >> sphera+%%k.asy echo path3 p3=path3(p^); >> sphera+%%k.asy echo revolution b=revolution(p3,X,0,360^); >> sphera+%%k.asy echo draw(surface(b^),green^); >> sphera+%%k.asy echo real g(real x^) {return sqrt(1-x^^2^);} >> sphera+%%k.asy echo pair G(real x^) {return (x,f(x^)^);} >> sphera+%%k.asy echo triple G3(real x^) {return (x,g(x^),0^);} >> sphera+%%k.asy echo path q=graph(G,1-i-%%k/%n%,1-i^); >> sphera+%%k.asy echo path3 q3=path3(q^); >> sphera+%%k.asy echo revolution c=revolution(q3,X,0,360^); >> sphera+%%k.asy echo draw(surface(c^),red^); >> sphera+%%k.asy echo axes3("$x$","$y$","$z$",Arrow3^); >> sphera+%%k.asy echo a.add(^); >>sphera+%%k.asy echo restore(^); >>sphera+%%k.asy echo } >>sphera+%%k.asy echo erase(^); >>sphera+%%k.asy echo label(a.pdf(^)^); >>sphera+%%k.asy ) for /l %%l in (0,1,%n%) do ( asy sphera+%%l.asy taskkill /F /IM AcroRd32.exe ) rem for /l %%l in (0,1,%n%) do rename sphera+%%l+0.pdf _sphera+%%l.pdf asy sphera.asy 

, , .gif wheel.asy. ,

 yequals(Label("$y=-1$",1.0),-1,extend=true,linetype("4 4")); 

sphera.asy , . , /« » .asy . .gif, Imagemagick 2d-:

صورة

, . , . ?

magick *.eps sphere.gif , , 2d- .eps. .gif . , 10 )). , , . , , , animation.asy. , ( ) ? .gif . , izgraphiki.asy – animation.asy – .pdf ( (. ) 3d ) .gif ( (. ) 3d ). , «» . «» .pdf, animation.asy, ( , ) - 4 , , -, : : , . , ( ) . animation.asy:

 string format=nativeformat(); plain.shipout(name,f,format=format,view=false); files.push(name+"."+format); shipped=false; 

, izgraphiki.asy:

 //string format=nativeformat(); //plain.shipout(name,f,format=format,view=false); //files.push(name+"."+format); //shipped=false; 

izgraphiki.asy:

izgraphiki.asy
 /***** * animation.asy * Andy Hammerlindl and John Bowman 2005/11/06 * * Produce GIF, inline PDF, or other animations. *****/ // animation delay is in milliseconds real animationdelay=50; typedef frame enclosure(frame); frame NoBox(frame f) { return f; } enclosure BBox(real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill) { return new frame(frame f) { box(f,xmargin,ymargin,p,filltype,above=false); return f; }; } struct animation { picture[] pictures; string[] files; int index; string prefix; bool global; // If true, use a global scaling for all frames; this requires // extra memory since the actual shipout is deferred until all frames have // been generated. void operator init(string prefix="", bool global=true) { prefix=replace(stripdirectory(outprefix(prefix))," ","_"); this.prefix=prefix; this.global=global; } string basename(string prefix=stripextension(prefix)) { return "_"+prefix; } string name(string prefix, int index) { return stripextension(prefix)+"+"+string(index); } private string nextname() { string name=basename(name(prefix,index)); ++index; return name; } void shipout(string name=nextname(), frame f) { // string format=nativeformat(); // plain.shipout(name,f,format="png",view=false); //generiruet!!!! //files.push(name+"."+format); // shipped=false; } void add(picture pic=currentpicture, enclosure enclosure=NoBox) { if(global) { ++index; pictures.push(pic.copy()); } else this.shipout(enclosure(pic.fit())); } void purge(bool keep=settings.keep) { if(!keep) { for(int i=0; i < files.length; ++i) delete(files[i]); } } int merge(int loops=0, real delay=animationdelay, string format="gif", string options="", bool keep=settings.keep) { string args="-loop " +(string) loops+" -delay "+(string)(delay/10)+ " -alpha Off -dispose Background "+options; for(int i=0; i < files.length; ++i) args += " " +files[i]; int rc=convert(args,prefix+"."+format,format=format); this.purge(keep); if(rc == 0) animate(file=prefix+"."+format,format=format); else abort("merge failed"); return rc; } void glmovie(string prefix=prefix, projection P=currentprojection) { if(!view() || settings.render == 0) return; fit(prefix,pictures,view=true,P); } // Export all frames with the same scaling. void export(string prefix=prefix, enclosure enclosure=NoBox, bool multipage=false, bool view=false, projection P=currentprojection) { if(pictures.length == 0) return; if(!global) multipage=false; bool inlinetex=settings.inlinetex; if(multipage) settings.inlinetex=false; frame multi; frame[] fits=fit(prefix,pictures,view=false,P); for(int i=0; i < fits.length; ++i) { string s=name(prefix,i); if(multipage) { add(multi,enclosure(fits[i])); newpage(multi); files.push(s+"."+nativeformat()); } else { if(pictures[i].empty3() || settings.render <= 0) this.shipout(s,enclosure(fits[i])); else // 3D frames files.push(s+"."+nativeformat()); } } if(multipage) { plain.shipout(prefix,multi,view=view); settings.inlinetex=inlinetex; } shipped=true; } string load(int frames, real delay=animationdelay, string options="", bool multipage=false) { if(!global) multipage=false; string s="\animategraphics["+options+"]{"+format("%.18f",1000/delay,"C")+ "}{"+basename(); if(!multipage) s += "+"; s += "}{0}{"+string(frames-1)+"}"; return s; } bool pdflatex() { return latex() && pdf(); } string pdf(enclosure enclosure=NoBox, real delay=animationdelay, string options="", bool keep=settings.keep, bool multipage=true) { if(settings.inlinetex) multipage=true; if(!global) multipage=false; if(!pdflatex()) abort("inline pdf animations require -tex pdflatex or -tex xelatex"); if(settings.outformat != "") settings.outformat="pdf"; string filename=basename(); string pdfname=filename+".pdf"; if(global) export(filename,enclosure,multipage=multipage); shipped=false; if(!keep) { exitfcn currentexitfunction=atexit(); void exitfunction() { if(currentexitfunction != null) currentexitfunction(); if(multipage || !settings.inlinetex) this.purge(); if(multipage && !settings.inlinetex) delete(pdfname); } atexit(exitfunction); } if(!multipage) delete(pdfname); return load(index,delay,options,multipage); } int movie(enclosure enclosure=NoBox, int loops=0, real delay=animationdelay, string format=settings.outformat == "" ? "gif" : settings.outformat, string options="", bool keep=settings.keep) { if(global) { if(format == "pdf") { export(enclosure,multipage=true,view=true); return 0; } export(enclosure); } return merge(loops,delay,format,options,keep); } } animation operator init() { animation a=animation(); return a; } 


,

 plain.shipout(name,f,format="png",view=false); //generiruet!!!! 

- animation.asy, , : , . .gif , izgraphiki.asy, izgraphikigif.asy animation.asy —
 plain.shipout(name,f,format= format,view=false); 

, . . izgraphikigif.asy :

 //plain.shipout(name,f,format= format,view=false); 

, . , animation.asy
izgraphikigif.asy , . , izgraphikigif.asy .pdf , 2 . , , - if, , : , , Asymptote. , , , , , , – :

 cd /d %0\.. echo off set n=2 set name=kriv echo settings.twice=true; >%name%.asy echo settings.prc=false; >> %name%.asy echo // Uncomment the following 2 lines to support pdf animations: >>%name%.asy echo usepackage("animate"^); >>%name%.asy echo settings.tex="pdflatex"; >>%name%.asy echo import sinoid; >>%name%.asy echo animation a; >>%name%.asy echo int n=%n%; >>%name%.asy echo for(int i=0; i ^<= n; ++i^) { >>%name%.asy echo a.add(^); // Add currentpicture to animation. >>%name%.asy echo restore(^); >>%name%.asy echo } >>%name%.asy echo erase(^); >>%name%.asy echo label(a.pdf(BBox(0.25cm^),delay=250,"controls",multipage=false^)^); >>%name%.asy for /l %%k in (0,1,%n%) do ( echo import graph; > %name%+%%k.asy echo settings.twice=true; >> %name%+%%k.asy echo usepackage("animate"^); >> %name%+%%k.asy echo settings.tex="pdflatex"; >> %name%+%%k.asy echo import animation; >> %name%+%%k.asy echo limits((-6.3,-6.3^),(6.3,6.3^)^); >> %name%+%%k.asy echo size(0,100^); >> %name%+%%k.asy echo animation a=animation(global=false^);>>%name%+%%k.asy echo for(int i=0; i ^<= 0; ++i^) { >>%name%+%%k.asy echo real r=0.925; >> %name%+%%k.asy echo real R=3.61; >> %name%+%%k.asy echo real d=1.39; >> %name%+%%k.asy echo real x(real t^) {return (R+r^)*cos(t^)-d*cos((R+r^)*t/r^);} >> %name%+%%k.asy echo real y(real t^) {return (R+r^)*sin(t^)-d*sin((R+r^)*t/r^);} >> %name%+%%k.asy echo draw(graph(x,y,0,2*pi*%%k/%n%^),green^); >> %name%+%%k.asy echo axes("$x$","$y$",Arrow^); >> %name%+%%k.asy echo a.add(^); // Add currentpicture to animation. >>%name%+%%k.asy echo restore(^); >>%name%+%%k.asy echo } >>%name%+%%k.asy echo erase(^); >>%name%+%%k.asy echo // Merge the images into a pdf animation. >>%name%+%%k.asy echo label(a.pdf(^)^); >>%name%+%%k.asy ) rem for /f %%l in (0,1,%n%) do asy '%name%+%%l'.asy rem asy *.asy for /l %%l in (0,1,%n%) do ( asy %name%+%%l.asy taskkill /IM AcroRd32.exe ) for /l %%l in (0,1,%n%) do rename %name%+%%l.pdf _%name%+%%l.pdf asy %name%.asy 


. , , : kriv.asy , 2d-.pdf , , , kriv.asy Asymptote , kriv.pdf , , , .pdf, .asy : , , . , : play , , , , ! – . , , , : kriv epicykloida. , Astroida. name krivaja, – kriv .pdf . , Asymptote: , , Astroida.asy, . .mpg (, ) , , , , - . , , , Asymptote : .asy, .pdf .asy, .gif, -, , .

.asy, .pdf, :

 label(a.pdf()); 

.asy, .gif, :

 a.movie(); 

.asy, .mpg, , .asy, .gif. .mpg .asy,

 settings.twice=true; 

, , .

Source: https://habr.com/ru/post/ar468125/


All Articles