گفتگو هایی در باب سی شارپ

the_king

مدیرکل انجمن
ممنون استاد علی
هر چند خیلی توجیه نشدم که چرا سی شارپ نمیتونست جایگزین Xaml بشه

همینکه یکم هم توجیه شده باشید عجیبه چون میگید با XAML آشنایی ندارید. زبان های برنامه نویسی و زبان های نشانه گذاری نمی توانند جایگزین هم باشند، تعجب می کنم از اینکه بگید بدون دانستن اینکه X چیه، تصور می کنم Y میتونه جایگزین اش باشه.
[/QUOTE]
یه سئوال اینکه ساده ترین روشی که بشه یه شکلی که ساختیم و رسم کردیم (مثلا یه مستطیلی رو داخل یه بیت مپ رسم کردیم) ، این شکل (مستطیل) رو بتونیم تغییر شکل بدیم مثلا 45 درجه همون شکل رو (نه اینکه یه شکل جدید دیگه) بچرخونیم ، چیه؟ یا حتی خودِ شیِ بیت مپ را میشه تغییر شکل داد؟
شاید بگین با پروپرتی Transform در اون شیِ گرافیک ولی من با ماتریکس ها آشناییتی ندارم و طرز کارش رو بلد نیستم . ساده تر از این روش ، وجود داره؟ یه نمونه ی کد ساده (خیلی ساده . مثلا یه مستطیلی رسم شه که بعدش 45 درجه چرخش پیدا کنه) میذارین؟ اگه میذارین ، لطفا به ساده ترین شکل ممکن باشه که متوجه بشم
ممنون
اساس تصویر Matrix ئه، یک آرایه دو بعدی. و روال های تغییر این تصویر هم بر اساس همون Matrix ئه مثل همون Transform. ساده تر از اون کار با کتابخانه های گرافیکی پردازش تصویر ئه که متد های ساده برای Rotate و ... دارند. اینکه چیزی رو بلد نیستید معنی اش این نیست که باید دنبال راه ساده تر بگردید، باید مطالعه اش کنید و یاد بگیرید. انگار نوشتن چند تا حرف الفبا رو بلد نباشید و بجای اینکه وقت بذارید و یادشون بگیرید، خودتون رو در جمله سازی مدام به زحمت بندازید تا کلمه هایی رو انتخاب کنید که اون حروف توشون نباشه. اگر قرار باشه صرفا بر اساس چیزی که بلد هستید برنامه نویسی کنید که پیشرفت نمی کنید. برای فهمیدن مثال های ساده چند خطی هم نه نیازی به راهنمایی کسی دارید و نه کسی نیازی به آموزش های شما داره. چند ثانیه توی گوگل متنی مثل C# Rotate Image رو جستجو کنید انواع نمونه های کد نویسی شده هست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
میگم این متد CopyFromScreen در گرافیک ، آرگومان هاش دقیقا چیه؟ پوینت اول و دوم اش برای چیه؟ همینطور سایزش؟ مستنداتش را خوندم . مقادیر مختلف رو تست کردم ولی قشنگ متوجه نشدم
کد زیر را با تغییر انواع پوینت های دو آرگومان نوشتم ، ولی هر بار که پوزیشن فرم را جابجا میکنم ، از جای مختلفی عکس میگیره!! :


کد:
gr.CopyFromScreen(new Point(this.Location.X, this.Location.Y), new Point(200, 200), new Size(400, 400));

این کد در رویدادِ کلیکِ دکمه نوشته شد
gr شیِ گرافیکی هست که از شیِ بیت مپ (که اندازه ی اون بیت مپ به اندازه ی ابعاد فرم هست) گرفته شده و بعد این شیِ بیت مپ در رویداد paint روی گرافیکِ فرم رسم میشه
--------------------------
همینطور متد Flush (در کلاس گرافیک) برای چیه و کجا کاربرد داره؟ اینم مستنداتش رو دیدم ولی متوجه نشدم
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون استاد علی
میگم این متد CopyFromScreen در گرافیک ، آرگومان هاش دقیقا چیه؟ پوینت اول و دوم اش برای چیه؟ همینطور سایزش؟ مستنداتش را خوندم . مقادیر مختلف رو تست کردم ولی قشنگ متوجه نشدم

کادر تشکیل میشه از نقطه مبدا و ابعاد. شما وقتی یک کادری رو از صفحه نمایش کپی می کنید از یک کادر مبدا کپی میشه در کادر مقصد. ابعاد کادر های مبدا و مقصد یکسانه و Resize صورت نمی گیره، برای همینه که ازتون دو تا ابعاد نمی خواد و فقط دو تا نقطه و یک ابعاد میخواد. باید مشخص کنید که از چه موقعیت مبدا ای کپی می کنید و در چه موقعیت مقصدی کپی می کنید و کادر اش چه ابعادی داره، این اون آرگومان ها است.
کد زیر را با تغییر انواع پوینت های دو آرگومان نوشتم ، ولی هر بار که پوزیشن فرم را جابجا میکنم ، از جای مختلفی عکس میگیره!! :
کد:
gr.CopyFromScreen(new Point(this.Location.X, this.Location.Y), new Point(200, 200), new Size(400, 400));
رجوع کنید به نوشته های قبلی تا ببینید مشکل تون با موقعیت ها از چیه : اینو همیشه تو برنامه نویسی ویندوز به یاد داشته باشید، دو جور موقعیت برای کنترل ها داریم

همینطور متد Flush (در کلاس گرافیک) برای چیه و کجا کاربرد داره؟ اینم مستنداتش رو دیدم ولی متوجه نشدم
یادتون باشه گفتم که Graphics رو برای دسترسی رسم فرض کنید نه حافظه تصویری. هر سخت افزار و سیستمی که اینطوری به عنوان یک واحد مستقل بهش دسترسی داشته باشید ممکنه در یک لحظه در دسترس باشه، در یک لحظه دیگه در دسترس نباشه و مشغول کاری باشه، سریعتر از پردازنده یا کندتر از اون باشه، همه اینها دلیل موجه ای است برای اینه که بافر برای نگه داشتن عملیات های در صف اجرا داشته باشه. یعنی وقتی درخواست رسم یک خط رو می کنید پروسه شما معطل نمیمونه که رسم تموم بشه، درخواست رو میگیره و میذاره داخل صف اجرا و بلافاصله پروسه و Graphics آماده است برای سایر درخواست ها.
بافر میتونه شامل عملیاتی باشه که در صف اجرا هست، ولی هنوز اجرا نشده. در حالت عادی بافر صبر میکنه که به یک حجمی از عملیات پشت صف برسه و بعد اجرا بشه یا یک مدت زمانی از در صف بودنها بگذره تا اجرا بشه. اینطوری سربار کاهش پیدا می کنه. اگر برای اجرا شدن عملیات خاصی عجله ای وجود داره با Flush درخواست اجرا شدن عملیات در صف داده میشه. معمولا نیازی به Flush نیست، چون معمولا زمان بین ایجاد و Dispose کوتاهه و موقع Dispose شدن تمامی عملیات های داخل بافر به پایان رسیده. Flush مختص Graphics نیست، بافر هایی که عملیات رو در صف انتظار نگه می دارند معمولا Flush رو دارند، مثل System.IO.Stream.Flush
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
اول اینکه تازه متوجه شدم برای تغییر شکل گرافیک (مثلا چرخشش) ، باید قبل از رسمِ گرافیک ، اون متد را فراخونی کنیم . من همیشه بعد از رسم فراخونی میکردم و کار نمیکرد :green:
حالا یه سئوال اینکه اولا وقتی یه گرافیکی (مثلا مستطیلی) را تغیییر شکل میدیم (مثلا میچرخونیم) ، کیفیت اش خودشو نشون میده و شطرنجی میشه . برای بهبود کیفیت اون گرافیک ، باید چی کار کرد؟ فقط پروپرتی SmoothingMode برای بهبود کیفیت هست؟ با این پروپرتی ، بهتر میشه ولی باز هم نه
دوم و مهمتر اینکه وقتی با متد RotateTransform میچرخونیم ، چرخش پیدا میکنه ولی نه نسبت به نقطه ی گوشه ی سمت چپِ اون مستطیل ؛ بلکه نسبت به نقطه ای که نمیدونم کجاست. حالا سئوالم اینه که چجوری میشه چرخش یک گرافیکی را نسبت به نقطه ی دیگه (مثلا نسبت به بالا و سمت چپِ اون مستطیل و یا نسبت به مرکز اون مستطیل) تنظیم کرد؟
کدش هم این بود :


کد:
gr.SmoothingMode = SmoothingMode.HighQuality;

                gr.RotateTransform(45f);
                gr.DrawRectangle(new Pen(Color.Red, 3), new Rectangle(350, 200, 200, 100));

قضیه ی شیِ gr رو که در پست قبلی گفتم و همونه
ممنون
 

the_king

مدیرکل انجمن
حالا یه سئوال اینکه اولا وقتی یه گرافیکی (مثلا مستطیلی) را تغیییر شکل میدیم (مثلا میچرخونیم) ، کیفیت اش خودشو نشون میده و شطرنجی میشه . برای بهبود کیفیت اون گرافیک ، باید چی کار کرد؟ فقط پروپرتی SmoothingMode برای بهبود کیفیت هست؟ با این پروپرتی ، بهتر میشه ولی باز هم نه
کیفیت همیشه تابعی از کیفیت اولیه است؛ اگه می خواهید کیفیت بهتر باشه باید تصویری که میچرخونید کیفیت بهتری داشته باشه، یعنی فرضا ابعاد اصلی اش 300 درصد بزرگتر از چیزی که نمایش می دهید باشه، بچرخونیدش و بعد با نسبت 1/3 نمایش بدید. برای همینه که در فتوشاپ Smart Object هست که کیفیت منبع اولیه بعد از تغییرات همچنان حفظ بشه.
دوم و مهمتر اینکه وقتی با متد RotateTransform میچرخونیم ، چرخش پیدا میکنه ولی نه نسبت به نقطه ی گوشه ی سمت چپِ اون مستطیل ؛ بلکه نسبت به نقطه ای که نمیدونم کجاست. حالا سئوالم اینه که چجوری میشه چرخش یک گرافیکی را نسبت به نقطه ی دیگه (مثلا نسبت به بالا و سمت چپِ اون مستطیل و یا نسبت به مرکز اون مستطیل) تنظیم کرد؟
کدش هم این بود :


کد:
gr.SmoothingMode = SmoothingMode.HighQuality;

                gr.RotateTransform(45f);
                gr.DrawRectangle(new Pen(Color.Red, 3), new Rectangle(350, 200, 200, 100));

قضیه ی شیِ gr رو که در پست قبلی گفتم و همونه
ممنون
فقط RotateTransform کافی نیست، باید اول با TranslateTransform به موقعیت مبدا دوران مثل (350,200) جابجا بشوید. با RotateTransform دوران رو بر مبنای اون نقطه فعلی انجام بدید. مجددا با TranslateTransform به سمت موقعیت اولیه شروع دوران مثل (200-,350-) برگردید (مقادیر منفی برای بازگشت در خلاف جهته) و بعد تازه رسم رو انجام بدید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
کیفیت همیشه تابعی از کیفیت اولیه است؛ اگه می خواهید کیفیت بهتر باشه باید تصویری که میچرخونید کیفیت بهتری داشته باشه، یعنی فرضا ابعاد اصلی اش 300 درصد بزرگتر از چیزی که نمایش می دهید باشه، بچرخونیدش و بعد با نسبت 1/3 نمایش بدید. برای همینه که در فتوشاپ Smart Object هست که کیفیت منبع اولیه بعد از تغییرات همچنان حفظ بشه.

فقط RotateTransform کافی نیست، باید اول با TranslateTransform به موقعیت مبدا دوران مثل (350,200) جابجا بشوید. با RotateTransform دوران رو بر مبنای اون نقطه فعلی انجام بدید. مجددا با TranslateTransform به سمت موقعیت اولیه شروع دوران مثل (200-,350-) برگردید (مقادیر منفی برای بازگشت در خلاف جهته) و بعد تازه رسم رو انجام بدید.

آها ممنون
پس متد TranslateTransform ، نقطه ی ثقل رو مشخص میکنه و کد بالا ، به این شکل باید تغییر کنه :


کد:
                gr.SmoothingMode = SmoothingMode.HighQuality;
                Rectangle rectangle = new Rectangle(350, 200, 200, 100);

                gr.TranslateTransform(rectangle.X, rectangle.Y);
                gr.RotateTransform(90f);
                gr.TranslateTransform(0-rectangle.X, 0-rectangle.Y);
                gr.DrawRectangle(new Pen(Color.Red, 3), rectangle);

-----------------------------

ولی یک چیزی ؛ چرا وقتی دوباره نقطه ی ثقل را برنمیگردونیم یعنی در کد زیر :


کد:
                gr.SmoothingMode = SmoothingMode.HighQuality;
                Rectangle rectangle = new Rectangle(350, 200, 200, 100);

                gr.TranslateTransform(rectangle.X, rectangle.Y);
                gr.RotateTransform(90f);
                gr.DrawRectangle(new Pen(Color.Red, 3), rectangle);

انتظار میره چون نقطه ی ثقل تغییر نکرد ، پس موقع فراخونی متد DrawRectangle که x=350 هست ، در واقع یعنی 350+350 (که یکی اش بخاطر تغییر نقطه ی ثقل و یکی دیگه هم نسبت به این نقطه هست) یعنی در نقطه ی 700 از محور x ها رسم بشه ولی این شکل ، در نقطه ی تقریبا 70 از محور x و چیزی در حدود نقطه ی 520 از محور y رسم میشه (البته مختصاتی که گفتم ، حدودی هست و ممکنه 20 تا این ور یا اون ور داشته باشه ولی انتظار میرفت در مختصات 700 در محور x و 400 در محور y رسم بشه)
دلیل رسم شکل در اون مختصات ، در کد دوم چیه؟
ممنون
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
و اینکه بجای استفاده ی مجدد از متد TranslateTransform ، کد زیر را نوشتم و میخوام از متدهای BeginContainer و EndContainer استفاده کنم ، ولی کار نمیکنه :

کد:
                gr.SmoothingMode = SmoothingMode.HighQuality;
                GraphicsContainer graphicsContainer = gr.BeginContainer();
                Rectangle rectangle = new Rectangle(350, 200, 200, 100);

                gr.TranslateTransform(rectangle.X, rectangle.Y);
                gr.RotateTransform(90f);

                gr.EndContainer(graphicsContainer);
                gr.DrawRectangle(new Pen(Color.Red, 3), rectangle);

آیا میشه بجاش از این متدهای BeginContainer و EndContainer استفاده کرد؟
اگه آره ، کد بالا چجوری باید ویرایش بشه و اصلا دلیل کار نکردنش (یعنی اینکه 90 درجه نمیچرخونه) چیه؟

-------------------------------

متدهای Save و Restore در گرافیک هم برای چیه؟ فرقش با متدهای BeginContainer و EndContainer چیه؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
یا چرا این کد کار نمیکنه؟ (بجای کد در پست 786) :

کد:
                gr.SmoothingMode = SmoothingMode.HighQuality;
                Rectangle rectangle = new Rectangle(350, 200, 200, 100);

                gr.TranslateTransform(rectangle.X, rectangle.Y);
                gr.RotateTransform(90f);
                gr.ResetTransform();
                gr.DrawRectangle(new Pen(Color.Red, 3), rectangle);

ولی این کد کار میکنه؟ :


کد:
            //Translate transformation matrix.
           e.Graphics.TranslateTransform(100, 0);

            // Save translated graphics state.
            GraphicsState transState = e.Graphics.Save();

            // Reset transformation matrix to identity and fill rectangle.
            e.Graphics.ResetTransform();
            e.Graphics.FillRectangle(new SolidBrush(Color.Red), 0, 0, 100, 100);

            // Restore graphics state to translated state and fill second

            // rectangle.
            e.Graphics.Restore(transState);
            e.Graphics.FillRectangle(new SolidBrush(Color.Blue), 0, 0, 100, 100);

روال شون که شبیه هم هه
---------------------
و اینکه تفاوت متد Save با متد BeginContainer و همینطور متد Restore با متد EndContainer در کلاس گرافیک چی هستن؟ توضیحات و مثال هایی که مایکروسافت برای این متدها آورد ، روال شون عین هم هستن و انگار هیچ فرقی بین شون نیست
--------------------
و اینکه مقدار شمارشی MatrixOrder در متدهای TranslateTransform و ... چیه؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ولی یک چیزی ؛ چرا وقتی دوباره نقطه ی ثقل را برنمیگردونیم یعنی در کد زیر :

کد:
                gr.SmoothingMode = SmoothingMode.HighQuality;
                Rectangle rectangle = new Rectangle(350, 200, 200, 100);

                gr.TranslateTransform(rectangle.X, rectangle.Y);
                gr.RotateTransform(90f);
                gr.DrawRectangle(new Pen(Color.Red, 3), rectangle);

انتظار میره چون نقطه ی ثقل تغییر نکرد ، پس موقع فراخونی متد DrawRectangle که x=350 هست ، در واقع یعنی 350+350 (که یکی اش بخاطر تغییر نقطه ی ثقل و یکی دیگه هم نسبت به این نقطه هست) یعنی در نقطه ی 700 از محور x ها رسم بشه ولی این شکل ، در نقطه ی تقریبا 70 از محور x و چیزی در حدود نقطه ی 520 از محور y رسم میشه (البته مختصاتی که گفتم ، حدودی هست و ممکنه 20 تا این ور یا اون ور داشته باشه ولی انتظار میرفت در مختصات 700 در محور x و 400 در محور y رسم بشه)
دلیل رسم شکل در اون مختصات ، در کد دوم چیه؟
ممنون
انتظارتون اشتباهه، پس دوران نخودیه؟ دوران در تغییر موقعیت نقشی نداره؟ در محاسبات تون باید زاویه دوران رو هم در نظر بگیرید، با ضرایب Sin و Cos تکمیل میشه، در Math.Sin و Math.Cos بر حسب رادیانه البته، نه درجه.
کد:
x' = base.x+(x*Cos(90) - y*Sin(90))
y' = base.y+(y*Cos(90) + x*Sin(90))
کد:
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            Invalidate();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawString(trackBar1.Value.ToString(), Font, Brushes.Black, new Point(10, 10));
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
            e.Graphics.DrawEllipse(Pens.Blue, new Rectangle(350 - 10, 200 - 10, 20, 20));
            e.Graphics.TranslateTransform(350, 200);
            e.Graphics.RotateTransform(trackBar1.Value);
            //e.Graphics.TranslateTransform(-350, -200);
            using (var p = new Pen(Color.Red, 3))
            {
                e.Graphics.DrawRectangle(p, new Rectangle(350, 200, 200, 100));
            }
            e.Graphics.ResetTransform();
            var r = Math.PI * trackBar1.Value / 180;
            var w = new Point(350 + (int)(350 * Math.Cos(r) - 200 * Math.Sin(r)), 200 + (int)(200 * Math.Cos(r) + 350 * Math.Sin(r)));
            e.Graphics.DrawEllipse(Pens.Blue, new Rectangle(w.X - 10, w.Y - 10, 20, 20));
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
میگم در کلاس Bitmap ، اعضای زیر را مختصرا بررسی کردم ولی نمیدونم چی هستن و کاربردشون کجاست . اگه مایل بودین ، بین این اعضا ، اون اعضایی که واسه ما مبتدی کاربردی تره ، میگین چیه و کاربردش کجاست؟ (نه صرفا همه ی اعضا رو) :
پروپرتی ها
PixelFormat و Flags Palette و HorizontalResolution و FrameDimensionsList و RawFormat
و متد هم GetEncoderParameterList
ممنون
 

the_king

مدیرکل انجمن
ممنون استاد علی
میگم در کلاس Bitmap ، اعضای زیر را مختصرا بررسی کردم ولی نمیدونم چی هستن و کاربردشون کجاست . اگه مایل بودین ، بین این اعضا ، اون اعضایی که واسه ما مبتدی کاربردی تره ، میگین چیه و کاربردش کجاست؟ (نه صرفا همه ی اعضا رو) :
پروپرتی ها
PixelFormat و Flags Palette و HorizontalResolution و FrameDimensionsList و RawFormat
و متد هم GetEncoderParameterList
ممنون
به مبتدی و حرفه ای بودن ربطی نداره ولی به موضوع کد نویسی ارتباط داره، هیچکدوم برای استفاده روزمره کاربردی نداره، چون در اغلب موارد فقط می خواهید تصویری رو از جایی بخوانید و در فلان ابعاد نمایش بدید و فراخوانی اش با روتین های آماده انجام میشه و نهایتش هم ممکنه در فایلی ذخیره اش کنید. دیگه اینکه موقع فراخوانی اش فرمت داخلیش چی بوده و ... برای اغلب نرم افزار ها مهم نیست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
در کد زیر :


کد:
            using (Graphics gr = Graphics.FromImage(this.BitmapMain))
            {
                using (GraphicsPath grPath = new GraphicsPath( FillMode.Winding))
                {
                    Rectangle rectangle = new Rectangle(10, 300, 200, 100);
                    Point[] pointArray = new Point[] { new Point(230, 200), new Point(400, 200), new Point(180, 300), new Point(400, 400) };
                    grPath.AddEllipse(rectangle);
                    grPath.AddBeziers(pointArray);
                    grPath.AddArc(new Rectangle(10, 400, 100, 100), 180f, 60);


                    gr.DrawPath(new Pen(Brushes.LawnGreen, 3), grPath);
                }
            }

تا وقتی Beziers رو رسم میکنم مشکلی نیست ولی وقتی بعدش Arc رو رسم میکنم ، اتوماتیک از انتهای آخرین نقطه در Beziers ، تا ابتدای اولین نقطه در Arc ، خودش یه خط میکشه !!
دلیل اش چیه و چجوری میشه مشکلش را حل کرد؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بعد اینکه در کد زیر :

کد:
            using (Graphics gr = Graphics.FromImage(this.BitmapMain))
            {
                Rectangle rectangle = new Rectangle(100, 300, 200, 100);
                Point[] pointArray = new Point[] { rectangle.Location, new Point(300, 300), new Point(300, 400), new Point(100, 400) };
                using (PathGradientBrush pathBrush = new PathGradientBrush(pointArray))
                {
                    pathBrush.CenterColor = Color.LawnGreen;
                    pathBrush.TranslateTransform(Convert.ToSingle(rectangle.X), Convert.ToSingle(rectangle.Y));
                    pathBrush.CenterPoint = new PointF(0, 0);
                    pathBrush.TranslateTransform(0 - Convert.ToSingle(rectangle.X), 0 - Convert.ToSingle(rectangle.Y));
                   
                    gr.FillRectangle(pathBrush, rectangle);
                }
               
            }
            this.Invalidate();

اول مبدا مختصاتِ شی PathGradientBrush را با TranslateTransform آوردم روی گوشه ی بالای سمت چپ مستطیل (مختصات 100 و 300) و بعد پروپرتی CenterPoint را به مختصات 0 و 0 (که طبعا با تغییر مبدا مختصات ، باید همون نقطه ی 100 و 300 بشه) تغییر دادم و بعد دوباره TranslateTransform را برگردوندم سر جای اولش و شکل را رسم کردم
بنابراین طبعا نباید با کد زیر فرق کنه :


کد:
            using (Graphics gr = Graphics.FromImage(this.BitmapMain))
            {
                Rectangle rectangle = new Rectangle(100, 300, 200, 100);
                Point[] pointArray = new Point[] { rectangle.Location, new Point(300, 300), new Point(300, 400), new Point(100, 400) };
                using (PathGradientBrush pathBrush = new PathGradientBrush(pointArray))
                {
                    pathBrush.CenterColor = Color.LawnGreen;
                    pathBrush.CenterPoint = rectangle.Location;
                   
                    gr.FillRectangle(pathBrush, rectangle);
                }
               
            }
            this.Invalidate();

ولی نتیجه فرق میکنه . چرا؟
 

the_king

مدیرکل انجمن
ممنون استاد علی
در کد زیر :


کد:
            using (Graphics gr = Graphics.FromImage(this.BitmapMain))
            {
                using (GraphicsPath grPath = new GraphicsPath( FillMode.Winding))
                {
                    Rectangle rectangle = new Rectangle(10, 300, 200, 100);
                    Point[] pointArray = new Point[] { new Point(230, 200), new Point(400, 200), new Point(180, 300), new Point(400, 400) };
                    grPath.AddEllipse(rectangle);
                    grPath.AddBeziers(pointArray);
                    grPath.AddArc(new Rectangle(10, 400, 100, 100), 180f, 60);


                    gr.DrawPath(new Pen(Brushes.LawnGreen, 3), grPath);
                }
            }

تا وقتی Beziers رو رسم میکنم مشکلی نیست ولی وقتی بعدش Arc رو رسم میکنم ، اتوماتیک از انتهای آخرین نقطه در Beziers ، تا ابتدای اولین نقطه در Arc ، خودش یه خط میکشه !!
دلیل اش چیه و چجوری میشه مشکلش را حل کرد؟
دلیلش همونه که در توضیحات متد اش نوشته :
Remarks
If there are previous lines or curves in the figure, a line is added to connect the endpoint of the previous segment to the beginning of the arc.
اگه یه ()grPath.StartFigure بین شون اضافه کنید رسم های قبلی رو جزو شکل قبلی حساب می کنه و چون شروع شکل جدیدی خواهد بود Arc به چیزی وصل نمیشه.


اول مبدا مختصاتِ شی PathGradientBrush را با TranslateTransform آوردم روی گوشه ی بالای سمت چپ مستطیل (مختصات 100 و 300) و بعد پروپرتی CenterPoint را به مختصات 0 و 0 (که طبعا با تغییر مبدا مختصات ، باید همون نقطه ی 100 و 300 بشه) تغییر دادم و بعد دوباره TranslateTransform را برگردوندم سر جای اولش و شکل را رسم کردم
خیر. شما یک براش داشتید که فرضا یک نقطه از کادر اش در مختصات rectangle.Location بود که (100,300) ئه. بعد براش رو به اندازه (300+,100+) جابجا اش کردید که موقعیت اون نقطه قبلی تبدیل میشه به (200,600).
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
میگم ، میشه یه کم قضیه ی ماتریکس ها را بگین ؟ مثلا کلاس ColorMatrix را . من مثال شو در لینک زیر دیدم :
ColorMatrix Class (System.Drawing.Imaging)

ولی متوجه ی ماتریکسی که مثال زد ، نشدم . یعنی متوجه ی کد زیر نشدم :


کد:
float[][] colorMatrixElements = {
   new float[] {2,  0,  0,  0, 0},        // red scaling factor of 2
   new float[] {0,  1,  0,  0, 0},        // green scaling factor of 1
   new float[] {0,  0,  1,  0, 0},        // blue scaling factor of 1
   new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
   new float[] {.2f, .2f, .2f, 0, 1}};    // three translations of 0.2

که هر عضوش (که باز آرایه ای از float ها هست) ، دقیقا چیه؟ اول اینکه هر عضوش ، باید رنگ باشه دیگه . درسته؟ یعنی باید مشخص کننده ی ARGB باشه هر عضوش دیگه . درسته؟ و مهمتر اینکه رابطه ی این رنگ هایی (رابطه ی اعضای آرایه ی colorMatrixElements) که مثال زد ، چی ان؟
این رابطه چجوری هه که ایندکسِ 1 از دومین عضو ، و ایندکسِ 2 از سومین عضو ، و ایندکسِ 3 از چهارمین عضو ، مقدارشون 1 هه؟ و هر رابطه ی دیگه ای که بین شون وجود داره چیه؟
 

the_king

مدیرکل انجمن
ممنون استاد علی
میگم ، میشه یه کم قضیه ی ماتریکس ها را بگین ؟ مثلا کلاس ColorMatrix را . من مثال شو در لینک زیر دیدم :
ColorMatrix Class (System.Drawing.Imaging)

ولی متوجه ی ماتریکسی که مثال زد ، نشدم . یعنی متوجه ی کد زیر نشدم :


کد:
float[][] colorMatrixElements = {
   new float[] {2,  0,  0,  0, 0},        // red scaling factor of 2
   new float[] {0,  1,  0,  0, 0},        // green scaling factor of 1
   new float[] {0,  0,  1,  0, 0},        // blue scaling factor of 1
   new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
   new float[] {.2f, .2f, .2f, 0, 1}};    // three translations of 0.2

که هر عضوش (که باز آرایه ای از float ها هست) ، دقیقا چیه؟ اول اینکه هر عضوش ، باید رنگ باشه دیگه . درسته؟ یعنی باید مشخص کننده ی ARGB باشه هر عضوش دیگه . درسته؟ و مهمتر اینکه رابطه ی این رنگ هایی (رابطه ی اعضای آرایه ی colorMatrixElements) که مثال زد ، چی ان؟
این رابطه چجوری هه که ایندکسِ 1 از دومین عضو ، و ایندکسِ 2 از سومین عضو ، و ایندکسِ 3 از چهارمین عضو ، مقدارشون 1 هه؟ و هر رابطه ی دیگه ای که بین شون وجود داره چیه؟
باید درس پردازش تصویر رو خونده باشید یا پردازش تصویر در متلب کار کرده باشید تا براتون قابل درک باشه، اون ماتریس 5 در 5 ای ئه که رنگ تصویر که یک سطر 5 عضوی ئه در اون ضرب میشه تا خروجی بدست میاد. اعضاء اش حکم ضریب رو دارند. اگه فرمول ریاضی ضرب سطر در ماتریس رو بدونید، میدونید که با چه فرمولی انجام میشه. ماتریس 5 در 5 ئه، چون سطر رنگ خودش 5 تا عنصر داره (RGBAW) که آخری سفید (طیف سیاه و سفید) ئه.
با این ماتریس میشه انواع تغییرات خطی رنگ رو برای ورودی اعمال کرد، خطی از این جهت که فرضا کنتراست و روشنایی ضرایب خطی دارن ولی فرضا تصحیح گاما لگاریتمی ئه و دیگه خطی نیست که بشه با این ماتریس رنگ اعمالش کرد. اون مقدار هایی که میگید 1 ئه روی قطر اصلی ماتریس ئه، میتونه بجز 1 باشه، اما اگر ضرایب قطر اصلی 1 باشه کنتراست رنگ ها تغییر نمی کنه که حالت پیشفرض ئه، اگر غیر از 1 باشه کنتراست رو تغییر میده، مثل اون 2 که برای رنگ قرمز بکار رفته. یه نگاهی به این مثال ها بندازید بد نیست : ColorMatrix Guide
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
باید درس پردازش تصویر رو خونده باشید یا پردازش تصویر در متلب کار کرده باشید تا براتون قابل درک باشه، اون ماتریس 5 در 5 ای ئه که رنگ تصویر که یک سطر 5 عضوی ئه در اون ضرب میشه تا خروجی بدست میاد. اعضاء اش حکم ضریب رو دارند. اگه فرمول ریاضی ضرب سطر در ماتریس رو بدونید، میدونید که با چه فرمولی انجام میشه. ماتریس 5 در 5 ئه، چون سطر رنگ خودش 5 تا عنصر داره (RGBAW) که آخری سفید (طیف سیاه و سفید) ئه.
با این ماتریس میشه انواع تغییرات خطی رنگ رو برای ورودی اعمال کرد، خطی از این جهت که فرضا کنتراست و روشنایی ضرایب خطی دارن ولی فرضا تصحیح گاما لگاریتمی ئه و دیگه خطی نیست که بشه با این ماتریس رنگ اعمالش کرد. اون مقدار هایی که میگید 1 ئه روی قطر اصلی ماتریس ئه، میتونه بجز 1 باشه، اما اگر ضرایب قطر اصلی 1 باشه کنتراست رنگ ها تغییر نمی کنه که حالت پیشفرض ئه، اگر غیر از 1 باشه کنتراست رو تغییر میده، مثل اون 2 که برای رنگ قرمز بکار رفته. یه نگاهی به این مثال ها بندازید بد نیست : ColorMatrix Guide

ممنون
اه
چی کارا باهاش نمیشه کرد ها
چقدر اون لینک ، تغییراتِ رنگِ جالبی را مثال زد
با این ماتریس میشه نرم افزار تصحیح رنگ ساخت
پس برای درک اینا ، فقط به علمِ ماتریس در ریاضی لازم هست یا ملزوماتِ دیگه ای هم داره؟
لا مصب ، یه منبع فارسی نیست آدم 4 ساعت انگلیسی نخونه :green:
 

the_king

مدیرکل انجمن
ممنون
اه
چی کارا باهاش نمیشه کرد ها
چقدر اون لینک ، تغییراتِ رنگِ جالبی را مثال زد
با این ماتریس میشه نرم افزار تصحیح رنگ ساخت
پس برای درک اینا ، فقط به علمِ ماتریس در ریاضی لازم هست یا ملزوماتِ دیگه ای هم داره؟
لا مصب ، یه منبع فارسی نیست آدم 4 ساعت انگلیسی نخونه :green:
کلا گرافیک کامپیوتری و پردازش تصویر چه دو بعدی و چه سه بعدی مبانی اش ریاضیات ئه، توابع مثلثاتی و لگاریتم و مشتق و ... ماتریس فقط بخش کوچیکی از اونه که تقریبا از همه شون ساده تره. اما در بحث های پیچیده که الگوریتم های هوشمند لازمه دیگه فقط ریاضیات نیست؛ به هوش مصنوعی ربط پیدا می کنه و در نتیجه شبکه های عصبی و منطق فازی و یادگیری ماشینی و ...

فرصت نکرده بودم کدشو بهینه کنم ولی در کل برای آشنایی با ساختار داخلی فیلتر های ابتدایی مناسبه، چون صرفا با بایت های داخل Bitmap کار می کنه نه روتین های آماده :
پیاده سازی فیلتر های گرافیکی در #c
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
کلا گرافیک کامپیوتری و پردازش تصویر چه دو بعدی و چه سه بعدی مبانی اش ریاضیات ئه، توابع مثلثاتی و لگاریتم و مشتق و ... ماتریس فقط بخش کوچیکی از اونه که تقریبا از همه شون ساده تره. اما در بحث های پیچیده که الگوریتم های هوشمند لازمه دیگه فقط ریاضیات نیست؛ به هوش مصنوعی ربط پیدا می کنه و در نتیجه شبکه های عصبی و منطق فازی و یادگیری ماشینی و ...

فرصت نکرده بودم کدشو بهینه کنم ولی در کل برای آشنایی با ساختار داخلی فیلتر های ابتدایی مناسبه، چون صرفا با بایت های داخل Bitmap کار می کنه نه روتین های آماده :
پیاده سازی فیلتر های گرافیکی در #c

ممنون استاد علی
مشتق؟
من توی هر چیز از ریاضی ضعیف بودم ، اون موقع مشتق در ریاضی را تقریبا بلد بودم :green:
مشتق توی کجای پردازش تصویر کاربرد داره؟ (یه مثال میزنین؟ البته نه اینکه کد بنویسین . منظورم اینه که کاربرد مشتق کجاهاست؟)

----------------------------------

پروژه ای که دادین خیلی جالبه . ای کاش وقت داشتم و تک تک الگوریتم ها را بررسی میکردم (البته نگاهی میندازم)
ولی توی اونا ، خیلی دوست دارم با blur آشنا بشم . روالِ کلی Blur چجوری هه؟
 

the_king

مدیرکل انجمن
ممنون استاد علی
مشتق؟
من توی هر چیز از ریاضی ضعیف بودم ، اون موقع مشتق در ریاضی را تقریبا بلد بودم :green:
مشتق توی کجای پردازش تصویر کاربرد داره؟ (یه مثال میزنین؟ البته نه اینکه کد بنویسین . منظورم اینه که کاربرد مشتق کجاهاست؟)

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

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

بالا