کمک - opengl

meisamphp

New Member
سلام .. من می دونم سئوالم سطحش خیلی پایین تر از بحث های شماست .. اما اگه جوابمو بدین لطف کردین ..

من یه پروژه دارم به زبان دلفی با opengl رسم دایره ، مربع ، چند ظلعی و اینجور شکلا ..

پروژه رو انجام دادم .. به صورتیکه مثلا با درگ کردن موس در صفحه این شکلا رو می کشه ..

اما مشکل اینجاست که وقتی مثلا دایره رو انتخاب میکنیم دایره کشیده می شه و در ادامه یه دایره دیگه میکشیم ، اون دایره قبلی از صفحه پاک میشه
lstx_016.png


چون برنامه هم جوری هستش که با درگ کردن موس شکلو می کشه اگه پاک کردن صفحه رو از ابتدای کشیدن شکل بردارم وقتی کاربر داره دایره می کشه وقتی موس رو از مرکز دایره درگ می کنه کلی دیره تو هم میکشه تا کاربر دسنشو از رو موس برداره ..
وقتی هم پاک کردن صفحه رو میزارم تا اینجوری نشه با کشیدن دایره جدید ، دایره قبلی پاک میشه ..

من چی کار باید بکنم .. لطف میکنید اگه کمکم کنید ..
 

meisamphp

New Member
کد:
  procedure OneLine();
  begin
       glEnable(GL_DEPTH_TEST);
       glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
       glLoadIdentity();
       glOrtho( 0, 665, 467, 0, -1, 1);
       glColor3f (1.0, 0.0, 0.7);
       glEnable (GL_LINE_STIPPLE);
       drawoneline(Q,W,E,R);
       glFlush;
  end;
این یه کد کشیدن خط هستش .. به این صورت که وقتی کاربر روی صفحه کلیک میکنه مقدار Q,W به عنوان ابتدای خط به تابع ارسال می شه ( که مشخصات نقطه ای هستش که موس در آن قرار داره ) و تا وقتی که کاربر دستشو از روی کلید موس برنداشته همین جور مقدار E,R به صورت متوالی به تابع ارسال شده و پشت سر هم خط تغییر میکنه ..

حالا اگه glClear رو از تابع پاک کنم ، تا وقتی که کاربر میخواد خط جدیدی بکشه خط قبلی پاک نشه ، اون وقت وقتی میخواد خط بکشه توی صفحه هر جایی که موس تکون می خوره خط کشیده میشه و پاک نمیشه ، جوری که همه صفحه پر از خط می شه ..

حالا من باید چی کار کنم که کاربر بتونه بدون اینکه خط قبلیش پاک بشه خط جدیدی بکشه (ممنون میشم اگه کمکم کنید)
 

the_king

مدیرکل انجمن
کد:
  procedure OneLine();
  begin
       glEnable(GL_DEPTH_TEST);
       glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
       glLoadIdentity();
       glOrtho( 0, 665, 467, 0, -1, 1);
       glColor3f (1.0, 0.0, 0.7);
       glEnable (GL_LINE_STIPPLE);
       drawoneline(Q,W,E,R);
       glFlush;
  end;
این یه کد کشیدن خط هستش .. به این صورت که وقتی کاربر روی صفحه کلیک میکنه مقدار Q,W به عنوان ابتدای خط به تابع ارسال می شه ( که مشخصات نقطه ای هستش که موس در آن قرار داره ) و تا وقتی که کاربر دستشو از روی کلید موس برنداشته همین جور مقدار E,R به صورت متوالی به تابع ارسال شده و پشت سر هم خط تغییر میکنه ..

حالا اگه glClear رو از تابع پاک کنم ، تا وقتی که کاربر میخواد خط جدیدی بکشه خط قبلی پاک نشه ، اون وقت وقتی میخواد خط بکشه توی صفحه هر جایی که موس تکون می خوره خط کشیده میشه و پاک نمیشه ، جوری که همه صفحه پر از خط می شه ..

حالا من باید چی کار کنم که کاربر بتونه بدون اینکه خط قبلیش پاک بشه خط جدیدی بکشه (ممنون میشم اگه کمکم کنید)

حقیر نه دلفی کار می کنم و نه OpenGL بنابراین نمی توانم در تکمیل کدتان کمکتان کنم، اما راه حل مساله واضح است :

شیوه اول)
برنامه شما لیست مختصات خطوطی که تا حالا کشیده و کارشان تمام شده را در حافظه ای نگه خواهد داشت تا هر زمان
که خواستید خطی که هنوز کاربر رسم اش را به پایان نبرده را رسم کنید ابتدا، صفحه نمایش بطور کامل پاک شود، سپس
خطوطی که قبلا رسم شده بود و مختصاتشان را در حافظه نگهداری کرده ایم مجددا رسم شوند و در انتها خط جدیدی
که هنوز رسم اش به پایان نرسیده بصورت موقتی رسم خواهد شد. چون هر بار صفحه نمایش پاک می شود هیچ اثری
از تغییر موقعیت خط جدید بر صفحه نمایش باقی نمی ماند. هر زمان که کاربر دستش را از روی ماوس برداشت، مختصات
خط جدید را به لیست خطوط قبلی اضافه می کنید تا در نمایش های بعدی رسم شود.
عیب این روش کندی و پرپر زدن صفحه نمایش در مواقعی است که تعداد خطوط رسم شده خیلی زیاد باشند.
حسن این روش در کمی حافظه مورد نیاز است.

شیوه دوم)
برنامه شما بجای نگهداری لیست مختصات خطوط قبلی تنها از صفحه نمایش یک تصویر را در حافظه نگهداری می کند،
هر زمانی که خواستید که یک خط را بطور موقتی رسم کنید، اول صفحه نمایش را با آن تصویر جایگزین می کنید و سپس
خط جدید را رسم می کنید. هر زمان که کاربر دستش را از روی ماوس برداشت حافظه ای که برای نگهداری تصویر
بکار برده بودید را با وضعیت جدید صفحه نمایش پر می کنید، بدین شکل شما همیشه تمامی خطوط قبلی که مختصات
تثبیت شده ای دارند را در آن تصویر دارید و نیازی به پاک کردن صفحه نمایش هم نیست.
عیب این روش نیاز به یک حافظه تصویر برای نگهداری محتویات کل صفحه نمایش است.
حسن این روش در سرعت رسم بالا و جلوگیری از پرپر زدن صفحه نمایش است.

شیوه سوم)
در این شیوه بجای نگهداری مختصات خطوط قبلی و یا نگهداری تصویری از صفحه نمایش تنها به رسم خط جابجا شده با
رنگ زمینه اکتفا می شود، بدین شکل که هر بار که مختصات خط جدید جابجا می شود، یک خط با رنگ زمینه در همان
موقعیت قبلی رسم می شود و سپس خط مجددا در مختصات جدید با رنگ دلخواه رسم می شود.
عیب این روش در این است که تنها زمانی کاربرد دارد که اولا زمینه تنها یک رنگ ساده باشد، و ثانیا رسم خط با رنگ زمینه
به خطوط زیرین قبلی آسیب می رساند و آنها را پاک می کند.
حسن این روش در حداقل مصرف حافظه، سادگی پیاده سازی و سرعت بالای نمایش آن است.

اگر مشاهده یک نمونه کد ویژوال بیسیک در این مورد کمکتان می کند، اعلام کنید تا ارائه کنم.
 

meisamphp

New Member
سلام ..
خوب مشکل اینجاست که چون من هم زیاد opengl بلد نیستم ..
آیا کسی هستش که چگونکی ذخیره کردن تصویری که با opengl تو فورم کشیدم رو بمن یاد بده ؟؟ ( ممنون میشم )
 

saalek110

Well-Known Member
http://www.parsiforums.com/showpost.php?p=48317&postcount=11
برادر وحید نصیری هم جزوه بسیار خوبی در مورد OpenGl نوشته اند که توصیه میکنم ازش استفاده کنی ، بخش قابل توجهی اش مرتبط با دلفی است و به زبان فارسی اطلاعات مفیدی بهت میده

سالک: متن بالا تقل قول بود. و در لینک بالا می توانید کتاب را دانلود کنید.
 

farhad110

Member
سلام
توی کتاب mastering delphi 7 به صورت کامل درباره این مشکل که در canvas وجود داره توضیح داده شده
البته دقیقا نمیدونم کدوم فصلش بود. اگر دانلود کردید و تمایل داشتید بگید تا دقیق تر راهنمایی کنم
موفق باشید
 

جدیدترین ارسال ها

بالا