PDA

View Full Version : رسم یک خط به موازات منحنی برای بدست آوردن نقطه تلاقی



نیکناز
چهارشنبه 14 خرداد 1393, 10:24 صبح
سلام دوستان
من یه مجموعه از نقاط دارم . یعنی زوج مرتب . و یه منحنی با این نقاط رسم می کنم .
حالا می خوام رو محور x ، به میزان 0.2 داخل شم و خطی به موازات منحنی رسم کنم تا ببینم تو چه نقطه ای منحنی رو قطع می کنه.
چطور می تونم این خط و رسم کنم . داده های من فقط همین زوج مرتب هاست.

منطقش چه جوریه ؟

خیلی تو نت گشتم ولی بی نتیجه.
می شه یه راهنمایی کنید یا کلید واژه معرفی کنید .شاید سرچم درست نبوده .
119867

barnamenevisforme
چهارشنبه 14 خرداد 1393, 10:33 صبح
سلام
رسم خط که مسئله ای نداره،شما با اضافه کردن مقدار 2. به x داده های خط سبز،خط رو به موازات خط قبلی جلو میبرید،
اما مسئله پیدا کردن نقطه تلاقی هست،که فکر میکنم باید از پردازش تصویر و گرفتن مقدار پیکسل استفاده کنید

نیکناز
چهارشنبه 14 خرداد 1393, 10:43 صبح
سلام
رسم خط که مسئله ای نداره،شما با اضافه کردن مقدار 2. به x داده های خط سبز،خط رو به موازات خط قبلی جلو میبرید،
اما مسئله پیدا کردن نقطه تلاقی هست،که فکر میکنم باید از پردازش تصویر و گرفتن مقدار پیکسل استفاده کنید

الان مسئله من رسم خطه
کد نوشتم که مثلا به ازای هر x+2 ، x شود ولی این کد در واقع یک نمودار جدید با فاصله 2 از نمودار اصلی ساخت نه یک خط مستقیم

barnamenevisforme
چهارشنبه 14 خرداد 1393, 10:50 صبح
آهان،شما فقط داده های منحنی رو دارید،خوب شما اگر بخواید به اندازه 2x. وارد بشید،بینهایت خط با شیب های مختلف میتونید رسم کنید.
باید شیب خاصی رو مد نظر داشته باشید.مثلا اگر شیب 1 رو در نظر داشته باشید،منحنی شما میشه 2.- y=x ،کافیه یک بار (0و2.)و یک بار نقطه (1و1.2) رو برای رسم انتخاب کنید

نیکناز
چهارشنبه 14 خرداد 1393, 11:36 صبح
من از این کد استفاده کردم ولی بی فایده بود

y=x+0.2

hart.Series["test"].Points.AddXY(X + 0.2, y);

barnamenevisforme
چهارشنبه 14 خرداد 1393, 15:06 عصر
من پست خودم رو ویرایش کرده بودم ولی ظاهرا شما متوجه نشدید.
فرمول درست 2. - y=x(تفریق،نه جمع)
در ضمن توصیه میکنم از کنترل zedgraph که open source هم هست استفاده کنید.

نیکناز
دوشنبه 19 خرداد 1393, 14:56 عصر
مرسی دوست عزیز
من موفق به رسم خط شدم
حالا چطور بگم جایی که خط نمودار رو قطع کرد؟

barnamenevisforme
شنبه 24 خرداد 1393, 15:09 عصر
خواهش میکنم
یک راه که به نظر من میرسه اینه که شما از نمودار یک خروجی با فرمت bitmap بگیرید.
بعد از کلاس bitmap استفاده کنید.ببینید مقدار RGB پیکسل هایی که مربوط به نقاط تقاطع هستن چقدره.
بعد میتونید برنامه رو بنویسید که بیاد پیکسل های تصویر رو بررسی کنه،هر کدوم از پیکسل ها اون مقدار بخصوص رو داشتن محل تقاطع خطوط خواهد بود.منتها اینجا آدرس پیکسل رو به دست آوردید.
برای تبدیل ادرس پیکسل به عدد x,y باید ادرس پیکسل مبدا مختصات رو هم داشته باشید بعد بین اینها نسبت بگیرید .
مثلا برای به دست اوردن نقطه x:
بین مبدا تا نطقه تقاطع مثلا 17 پیکسل فاصله وجود داره،از طرفی به دست اوردید که هر 5 پیکسل یک واحد در طول محور x هست،
پس مقدار عددی x=17/5 یا به عبارتی 3.4
این تکنیک استفاده از پردازش تصویر هست.
کنترل zedgraph خودش یه تابع داره به نام find nearest object شاید بشه از اون استفاده کرد ولی من خودم هنوز نتونستم ازش استفاده کنم.

نیکناز
یک شنبه 25 خرداد 1393, 08:06 صبح
خواهش میکنم
یک راه که به نظر من میرسه اینه که شما از نمودار یک خروجی با فرمت bitmap بگیرید.
بعد از کلاس bitmap استفاده کنید.ببینید مقدار RGB پیکسل هایی که مربوط به نقاط تقاطع هستن چقدره.
بعد میتونید برنامه رو بنویسید که بیاد پیکسل های تصویر رو بررسی کنه،هر کدوم از پیکسل ها اون مقدار بخصوص رو داشتن محل تقاطع خطوط خواهد بود.منتها اینجا آدرس پیکسل رو به دست آوردید.
برای تبدیل ادرس پیکسل به عدد x,y باید ادرس پیکسل مبدا مختصات رو هم داشته باشید بعد بین اینها نسبت بگیرید .
مثلا برای به دست اوردن نقطه x:
بین مبدا تا نطقه تقاطع مثلا 17 پیکسل فاصله وجود داره،از طرفی به دست اوردید که هر 5 پیکسل یک واحد در طول محور x هست،
پس مقدار عددی x=17/5 یا به عبارتی 3.4
این تکنیک استفاده از پردازش تصویر هست.
کنترل zedgraph خودش یه تابع داره به نام find nearest object شاید بشه از اون استفاده کرد ولی من خودم هنوز نتونستم ازش استفاده کنم.

مرسی
خروجی bitmap از نمودار گرفتم ولی موفق به انجام الگوریتم شما نشدم
اگه امکان داره با یک تکه کد بیشتر راهنمایی کنید
ممنونم

barnamenevisforme
یک شنبه 25 خرداد 1393, 11:14 صبح
سلام
در مورد کار کردن با پیکسل های یک bitmap باید این نکته رو در نظر بگیری که فراخوانی توابع Getpixel و setpixel یک مقدار زمان بر هست.
برای اجتناب از این کار باید بیت های اون رو lock کنی،اونوقت پردازش سریعتر انجام میشه.
مثلا قطعه کد زیر میاد مقدار تمام پیکسل های یک bitmap رو بعد از bit lock کردن اون چک میکه:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim bmp As New System.Drawing.Bitmap(picViewer1.Image) 'IMAGE FROM PICTURE BOX...

Call LockBitmap(bmp) 'LOCKING BITMAP

Dim RedValue As Int32
Dim GreenValue As Int32
Dim BlueValue As Int32
Dim l As Integer = 0 ' Pixel position
For x = 0 To bmp.Width - 1 'Pixels start with 0 so we need Height - 1
For y = 0 To bmp.Height - 1

l = ((bmp.Width * 3 * y) + (x * 3)) ' pixel is made of 3 parts (RGB colors)
RedValue = rgbValues(l)
GreenValue = rgbValues(l + 1)
BlueValue = rgbValues(l + 2)
If RedValue > 250 AndAlso GreenValue > 250 AndAlso BlueValue > 250 Then
Msgbox("Pixel is of a white color...")
ElseIf RedValue < 5 AndAlso GreenValue < 5 AndAlso BlueValue < 5 Then
Msgbox("Pixel is of a black color...")
Else
Msgbox("Pixel is not white or black ...")
End If
Next
Next

Call UnlockBitmap(bmp) 'UNLOCKING BITMAP

picViewer1.Image = (bmp)
picViewer1.Refresh()

End Sub

Private Sub LockBitmap(ByVal bmp As Bitmap)
Dim bounds As Rectangle = New Rectangle(0, 0, bmp.Width, bmp.Height)
bmpdata = bmp.LockBits(bounds, Imaging.ImageLockMode.ReadWrite, Imaging.PixelFormat.Format24bppRgb)
g_RowSizeBytes = bmpdata.Stride
Dim total_size As Integer = bmpdata.Stride * bmpdata.Height
ReDim rgbValues(total_size)
Marshal.Copy(bmpdata.Scan0, rgbValues, 0, total_size)
End Sub

Private Sub UnlockBitmap(ByVal bmp As Bitmap)
Dim total_size As Integer = bmpdata.Stride * bmpdata.Height
Marshal.Copy(rgbValues, 0, bmpdata.Scan0, total_size)
bmp.UnlockBits(bmpdata)
rgbValues = Nothing
bmpdata = Nothing
End Sub

barnamenevisforme
یک شنبه 25 خرداد 1393, 12:11 عصر
سلام
در مورد کار کردن با پیکسل های یک bitmap باید این نکته رو در نظر بگیری که فراخوانی توابع Getpixel و setpixel یک مقدار زمان بر هست.
برای اجتناب از این کار باید بیت های اون رو lock کنی،اونوقت پردازش سریعتر انجام میشه.
یه نمونه برنامه براتون گذاشتم ،توی این برنامه یه کلاس تعریف کرده به نام lockbits بعد میاد ازش استفاده میکنه
در واقع میاد مقدار پیکسل رو در تمام تصویر چک میکنه و هر جا مقدار سفید یا همون(255و255و255و255) پیدا کرد،مقدار اون رو برابر با قرمز قرار میده
منبع:
http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp
که در محیط Vb.net مورد استفاده قرار دادم