PDA

نسخه کامل مشاهده نسخه کامل : پر كردن يك بيضي



آرام جان گل
30-03-2007, 22:45
سلام

چطوري مي تونيم كه يك بيضي كشيده شده را با يك رنگ خاص پر كرد كه بيضي به اون رنگ پر شده ديده شود؟

كشيدن بيضي مشكل من نيست فقط مي خوام بدونم چطوري اون را پر كنم من خودم فكر مي كنم كه بايد بيضي هاي متحد المركزي بكشم و اون را پر كنم ولي چطوري درون و خارج بيضي زا تشخيص بدم؟

از كجا بدونم الان تابع putpixel ي كه بكار مي برم داره بيرون بيضي را پر مي كنه يا داخل اون رو

در حقيقت چطوري كد بنويسم كه تابع putpixel فقط درون بيضي بكار بيفته ؟ و نقاط را روشن كنه

لطفا راهنمايي كنيد
مرسي.

palizesoftware
30-03-2007, 23:01
الگوريتم‌هاي مختلفي هست براي پر كردن يك شكل
در اين ميان ميتونيد از روش همسايگي استفاده كنيد كه با داشتن يك نقطه درون يك شكل بسته، شروع به پر كردن كنيد و 8 مكان اطراف همين نقطه رو كنكاش كنيد و تابع پر كردن رو بصورت بازگشتي صدا بزنيد.
چون با سر ريز stack مواجع ميشيد پس بايد يه استك هم پياده‌سازي بكنيد.
يك توضيح و اينكه براي پر كردن، با دادن نقطه شروع رنگ‌آميزي اقدام به پر كردن كنيد تا اينكه به رنگي برسيد كه با رنگ اولين نقطه يكسان نباشد

someone
31-03-2007, 00:39
سلام.
ممنون از توضیحات دوستمون.البته زیاد سخت گرفتن! روش پیشنهادی نزدیک به Image Processing بود.
لازم نیست از تابع putpixel استفاده کنین. (اگه حتما باید با putpixel انجام بدین , بگید)
نمیدونم برای رسم یک بیضی از تابع ellipse استفاده کردین یا اینکه خودتون کدی رو برای پیاده سازیش
نوشتین. در هر دوصورت ellipese ی که رسم کردین دو تا شعاع داره. درسته؟ کافیه شما شروع به رسم
ellipse هایی کنین که از مقدار دو شعاع یکی یکی کم میشن تا به صفر برسن. به این صورت ellipse شما
پر میشه. (گرچه میتونین مستقیما از fillellipse استفاده کنین. که مستقیما یک ellipse تو پر رسم میکنه.)
نمونه ی زیر میتونه منظورم رو واضحتر بیان کنه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اگه مشکلی بود اطلاع بدین.

palizesoftware
31-03-2007, 12:30
كدي رو كه دوستمون آوردند براي پر كردن شكل بصورت دواير متحدالمركز هست. منتها توضيحات من جهت پر كردن هر شكلي قابل پياده‌سازي هست كه نمونه ‌اش رو برات آپلود كردم. اين پروژه مربوط به درس گرافيك كامپيوتري بود كه سالها پيش نوشته بودم و رسم پيكسل هم با توابع و اينتراپت‌هاي اسمبلي انجام شده بود.
بخش پر كردن شكل اينطوري هست:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

someone
31-03-2007, 15:49
دوباره سلام.
ممنون از کدتون اما من نتونستم بگیرمش. امکان داره جایی دیگه اونرو up کنین؟
ضمنا در نمونه ای که گذاشتین نقش mousepos چیه؟
متاسفانه همونطور که گفتم به کدتون دسترسی ندارم.

آرام جان گل
01-04-2007, 01:04
سلام
از كاربر someone وpalizesoftware ممنون

جواب كاربر someone براي من راحتر بود ولي چون شعاع ها و نقاط مركزي را از كابر مي گرفتم تغييرش دادم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اما راه كاربرpalize software بهتره چون به درد هر شكلي مي خوره ولي من تابع mouse.... را در هلپ گشتم پيدا نكردم و در ضمن clipx2 و clipex2 ....... براي چيه هستن؟

اگه كمكم كنيد فكر كنم كه راه خودم بهتر باشه
راه من:

مثلا برنامه طوري باشه(پر كردن يك poligan ) كه نقاطي را از يك كاربر دريافت كنه و شكل ان را رسم كنه و بعد ان را پر كنه اينطوري كه خطوط كشيده شده توسط نقاط را جايي ذخيره كنيم (كه اين كار رو نمي دونم چه طوري انجام بدم) بعد نقاط را يكي يكي روي محور ايكس پيمايش كنه ولي روشن نكنه تا به نقطه اي برسه كه روي يكي از خطوط ذخيره شده صدق كنه از اين به بعد نقاط را روشن كنه تا اينكه به خط بعدي برسه از اين به بعد دوباره فقط پيمايش كنه و روشن نكنه

ولي نمي دونم چطوري پياده كنم
لطفا راهنمايي كنيد
مرسي

palizesoftware
01-04-2007, 01:33
سلام
كل كد رو اينجا ميذارم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اون تابع MousePos هم براي نشون دادن موقعيت ماوس هست كه تعريف شده
براي راه‌حلي هم كه آرام ميخواد پياده كني ميتوني خيلي راحت از يه آرايه از نوع استراكچر دو عضوي استفاده كني كه به ازاي هر كليك يه انديس جلو بري و موقيت ماوس رو ذخيره كني تا اينكه به نقطه شروع برسي يا كاربر كليك راست كنه و نقطه آخر رو به اول وصل كني. در ضمن اين كد شامل رسم خط و مستطيل و دايره و ... هم هست كه ميتونه كمكت كنه. تابع پر كردن هم ممكنه اشكالاتي توي سطوح خيلي بزرگ داشته باشه كه فرصت نكردم اصلاحش كنم. بهر حال اميدوارم كمكت كنه

someone
01-04-2007, 04:46
دوباره سلام.
برای رسم یه polygon میتونید از برنامه زیر استفاده کنین:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یک struc داریم که مختصات x,y رو در خودش ذخیره میکنه.برای رسم polygon هم کافیه در ابتدا به اولین
نقطه حرکت کنیم و به نقطه ی بعدی خط رسم کنیم. در پایان هم از آخرین مختصات به مختصات آغازین خطی
رسم میکنیم. نمونه ساده ای هست.
اما در مورد پرکردنش و روشی که شما پیشنهاد دادین:
با استفاده از یه حلقه pixel به pixel محور افقی رو جاروب میکنیم و با استفاده از getpixel مقدار رنگ نقطه ی
مورد نظر رو بدست میاریم. هر وقت به اولین نقطه ی سفید رسیدیم با استفاده از putpixel یک نقطه ی
سفید رسم میکنیم و دوباره رنگ نقطه ی بعدی رو مقایسه میکنیم اگه سیاه بود دوباره از putpixel استفاده
میکنیم. و اگه سفید بود یعنی به انتها رسیدیم. بعد از اتمام مقدار محور عمودی رو یکی زیاد میکنیم و دوباره
عملیات رو انجام میدیم. تا کل صفحه رو scan کنیم. سعی کنین برنامه رو بنویسن. اگه به مشکل بر خوردین
اطلاع بدین.
اما روش زیاد سنجیده ای نیست. فرض کنین که screen شما 480*640 باشه. یعنی 307200 جستجو .
البته این مقدار max هست. بستگی داره که شکل در کجا باشه. هر چی از مرکز مختصات دورتر باشه جستجو
به عدد مورد نظر نزدیک تر میشه. وزمان زیادی میبره.

آرام جان گل
01-04-2007, 19:52
سلام
دوست دارم كه راه شما (كاربرsomeone ) راهم براي پر كردن يك polygon بدونم

مرسي

someone
03-04-2007, 02:13
دوباره سلام.
همون که دوستمون گفتن به طور کلی دو روش برای Fill کردن اشکال وجود داره.
1- Boundary Fill Algorithm
2- Scan line polygon fillling Algorithm
در مورد روش اول که دوستون توضیحش رو دادن. و یه نمونه از اون گذاشتن. (8 تایی)
اگه نظر من رو بخواید روش خیلی خوبی هست و خیلی ساده میشه پیادش کرد.
نمونه ای دوستمون گذاشتن رو با کمی تغییر براتون میذارم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

می بینید که کد خیلی ساده ای هست. به این صورت میتونین ازش استفاده کنین:
x,y مختصات نقطه ای از درون polygon هست. fill مقدار رنگ مورد نظرتون و bound مقدار رنگ مرز های
polygon هست. اگه مشکلی پیش اومد اطلاع بدین.

آرام جان گل
03-04-2007, 14:25
سلام
كاربر someone منظور شما اينه كه من polygon را رسم كنم و بعد اين تابع (boundfill )را براي پر كردن صدا بزنم؟
يعني به همين سادگي؟
باورم نميشه

someone
03-04-2007, 22:32
بله.
فقط باید نقطه ای از درون polygon رو انتخاب کنین.

آرام جان گل
03-04-2007, 22:41
سلام
من كاري راكه گفتيد كردم ولي يه پيغامي مي ده كه نمي دونم از چيه
من هم كد رو مي نويسم و هم پيغام رو

كد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

نگاه كنيد با اينكه من حتي درون تابع my_fill يك تابع بازگشتي هم تعريف كردهام كه سربار زياد نشود پيام زير را مي ده
پيام خطا:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
لطفا راهنمايي كنيد كه بايد چي كار كنم تا مشكل رفع بشه يا اينكه الگوريتم را عوض كنم
مرسي

someone
04-04-2007, 02:21
دوباره سلام.
دلیلش VDM هست. و به خاطر استفاده از این تابع بازگشتی.
اما برنامه که به کار بردین چند مورد داره.
1- در my_fill از putpixel استفاده نکردین.
2- از این تابع در یه حلقه استفاده کردین.
3- نقطه ی انتخابی شما در درون شکل نیست! بیرون ازش هست.
4- مقادیر fill و bound درست انتخاب نشدن.

برنامه رو براتون اصلاح کردم. (اجرا هم شده)


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اگه مشکلی بود اطلاع بدین.

bamzyyy
11-12-2012, 00:23
salam man ye karbar jadidam mitoni b manam komak koni?????man dar rabete ba inke ba estefade az khat eskan ye sheklo por konam moshkel daram algoritmesho mikham lotfan komakam konid harche zodtar mamnon:n03: