PDA

View Full Version : سوال: رسم نمودار دایره ای بصورت گرافیکی



elahe1393
یک شنبه 23 آذر 1393, 11:31 صبح
سلام
من یه نمودار دایره ای کشیدم می خوام محدوده زاویه ای که تعیین میکنم رو نشون بده محدوده زاویه بین 0 تا 90 درجه باشه درست کار میکنه ولی اگه خارج از این باشه درست کار نمیکنه و همه محدوده هارو تو 0 تا 90 نشون میده
مثلا برای بازه 20 تا 110 کدهای زیر رو نوشتم
private void Form1_Load(object sender, EventArgs e)
{
Bitmap bitmap = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
Graphics modelGraphic = Graphics.FromImage(bitmap);

float radStartPoint = (float)((Math.PI * 100) / 180), radEndPoint = (float)((Math.PI * 150 )/ 180);
float xStart = (float)(13.6) * (float)Math.Abs(Math.Cos(radStartPoint)), yStart = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
float xxStart = (float)(186.4) * (float)Math.Abs(Math.Cos(radStartPoint)), yyStart = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
float xEnd = (float)(13.6) * (float)Math.Abs(Math.Cos(radEndPoint)), yEnd = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
float xxEnd = (float)(186.4) * (float)Math.Abs(Math.Cos(radEndPoint)), yyEnd = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radEndPoint));

modelGraphic.FillRectangle(Brushes.White, 0, 0, 500, 500);
Rectangle rect1 = new Rectangle(100, 100, 200, 200);
modelGraphic.DrawEllipse(new Pen(Brushes.DarkOliveGreen, (float)(172.8)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.DarkGreen, (float)(144)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.ForestGreen, (float)(115.2)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.Green, (float)(86.4)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.LimeGreen, (float)(57.6)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.LightGreen, (float)(28.8)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.Black, 1), rect1);
modelGraphic.DrawLine(new Pen(Brushes.White, 1), xStart+200, yStart-220, xxStart+200, yyStart-220);
modelGraphic.DrawLine(new Pen(Brushes.White, 1), xEnd+200, yEnd-220, xxEnd+200, yyEnd-220);
pictureBox1.Image = bitmap;
}

ولی این نتیجه نمایش نموداره

126573

مشکل کجاست؟

ghossein
یک شنبه 23 آذر 1393, 13:08 عصر
سلام
این دو خط حذف کنید :
modelGraphic.DrawLine(new Pen(Brushes.White, 1), xStart+200, yStart-220, xxStart+200, yyStart-220);
modelGraphic.DrawLine(new Pen(Brushes.White, 1), xEnd+200, yEnd-220, xxEnd+200, yyEnd-220);



و برای رسم قسمتی از دایره با زاویه ای مشخص از دستور زیر استفاده کنید : برای مثال من یه نیم دایره رسم کردم. 0 تا 180

modelGraphic.DrawArc(new Pen(Brushes.Red, (float)(172.8)), rect1, 0.0F, 180.0F);

start angel : نقطه شروع قطاع
sweep angel : میزان حرکت به جلوی یا نقطه پایان.

elahe1393
یک شنبه 23 آذر 1393, 13:50 عصر
مرسی از راهنماییتون
تا حدودی به چیزی که میخوام میرسم ولی این جداسازی از جهت موافق عقربه ساعت انجام میشه من میخوام مخالف عقربه ساعت مطابق با نمودار مختصات این جداسازی انجام بشه یه کاری خودم کردم ولی کدهام زیاد شد ولی کلا به چیزی که می خوام رسیدم
public float xStart, yStart, xxStart, yyStart, xEnd, yEnd, xxEnd, yyEnd;

private void Form1_Load(object sender, EventArgs e)
{
Bitmap bitmap = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
Graphics modelGraphic = Graphics.FromImage(bitmap);
int startPoint = 20, endPoint = 100;

float radStartPoint = (float)((Math.PI * startPoint) / 180), radEndPoint = (float)((Math.PI * endPoint )/ 180);
if (startPoint >= 0 && startPoint <= 90)
{
xStart = (float)(13.6) * (float)Math.Abs(Math.Cos(radStartPoint));
yStart = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
xxStart = (float)(186.4) * (float)Math.Abs(Math.Cos(radStartPoint));
yyStart = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
}
else if (startPoint > 90 && startPoint <= 180)
{
xStart = (float)(-13.6) * (float)Math.Abs(Math.Cos(radStartPoint));
yStart = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
xxStart = (float)(-186.4) * (float)Math.Abs(Math.Cos(radStartPoint));
yyStart = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
}
else if (startPoint > 180 && startPoint <= 270)
{
xStart = (float)(-13.6) * (float)Math.Abs(Math.Cos(radStartPoint));
yStart = bitmap.Height - (float)(-13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
xxStart = (float)(-186.4) * (float)Math.Abs(Math.Cos(radStartPoint));
yyStart = bitmap.Height - (float)(-186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
}
else if (startPoint > 270 && startPoint < 360)
{
xStart = (float)(13.6) * (float)Math.Abs(Math.Cos(radStartPoint));
yStart = bitmap.Height - (float)(-13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
xxStart = (float)(186.4) * (float)Math.Abs(Math.Cos(radStartPoint));
yyStart = bitmap.Height - (float)(-186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
}

if (endPoint >= 0 && endPoint <= 90)
{
xEnd = (float)(13.6) * (float)Math.Abs(Math.Cos(radEndPoint));
yEnd = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
xxEnd = (float)(186.4) * (float)Math.Abs(Math.Cos(radEndPoint));
yyEnd = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radEndPoint));
}
else if (endPoint > 90 && endPoint <= 180)
{
xEnd = (float)(-13.6) * (float)Math.Abs(Math.Cos(radEndPoint));
yEnd = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
xxEnd = (float)(-186.4) * (float)Math.Abs(Math.Cos(radEndPoint));
yyEnd = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radEndPoint));
}
else if (endPoint > 180 && endPoint <= 270)
{
xEnd = (float)(-13.6) * (float)Math.Abs(Math.Cos(radEndPoint));
yEnd = bitmap.Height - (float)(-13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
xxEnd = (float)(-186.4) * (float)Math.Abs(Math.Cos(radEndPoint));
yyEnd = bitmap.Height - (float)(-186.4) * (float)Math.Abs(Math.Sin(radEndPoint));
}
else if (endPoint > 270 && endPoint <= 360)
{
xEnd = (float)(13.6) * (float)Math.Abs(Math.Cos(radEndPoint));
yEnd = bitmap.Height - (float)(-13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
xxEnd = (float)(186.4) * (float)Math.Abs(Math.Cos(radEndPoint));
yyEnd = bitmap.Height - (float)(-186.4) * (float)Math.Abs(Math.Sin(radEndPoint));
}

modelGraphic.FillRectangle(Brushes.White, 0, 0, 500, 500);
Rectangle rect1 = new Rectangle(100, 100, 200, 200);
modelGraphic.DrawEllipse(new Pen(Brushes.DarkOliveGreen, (float)(172.8)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.DarkGreen, (float)(144)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.ForestGreen, (float)(115.2)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.Green, (float)(86.4)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.LimeGreen, (float)(57.6)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.LightGreen, (float)(28.8)), rect1);
modelGraphic.DrawEllipse(new Pen(Brushes.Black, 1), rect1);
modelGraphic.DrawLine(new Pen(Brushes.White, 1), xStart+200, yStart-220, xxStart+200, yyStart-220);
modelGraphic.DrawLine(new Pen(Brushes.White, 1), xEnd+200, yEnd-220, xxEnd+200, yyEnd-220);
pictureBox1.Image = bitmap;
}

ghossein
یک شنبه 23 آذر 1393, 16:14 عصر
سلام
اگه می خواهید کمان ، عکس حرکت عقربه های ساعت ترسیم بشه ، پارامتر دوم رو (sweep angel) منفی بدید.

elahe1393
دوشنبه 01 دی 1393, 11:24 صبح
با سلام
من محیط نموداری دایره ای، 0 تا 360 درجه که بخشی را با توجه به بازه زاویه تعیین شده جدا می کند رسم کردم نمودار از نظر گسترش به قسمتهایی برای مشخص کردن سرعت تقسیم شده است محور مرکزی که بخش بالایی آن حرکت در جهت موافق و بخش پایینی حرکت در جهت معکوس را نشان میدهد با خطی به رنگ مشکی در وسط محیط نمودار رسم شده است.

126789

Bitmap bitmap = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
Graphics modelGraphic = Graphics.FromImage(bitmap);
int startPoint = 20, endPoint = 100;
//int point = 80, speed = 10;

float radStartPoint = (float)((Math.PI * startPoint) / 180), radEndPoint = (float)((Math.PI * endPoint )/ 180);
if (startPoint >= 0 && startPoint <= 90)
{
xStart = (float)(13.6) * (float)Math.Abs(Math.Cos(radStartPoint));
yStart = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
xxStart = (float)(186.4) * (float)Math.Abs(Math.Cos(radStartPoint));
yyStart = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
}
else if (startPoint > 90 && startPoint <= 180)
{
xStart = (float)(-13.6) * (float)Math.Abs(Math.Cos(radStartPoint));
yStart = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
xxStart = (float)(-186.4) * (float)Math.Abs(Math.Cos(radStartPoint));
yyStart = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
}
else if (startPoint > 180 && startPoint <= 270)
{
xStart = (float)(-13.6) * (float)Math.Abs(Math.Cos(radStartPoint));
yStart = bitmap.Height - (float)(-13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
xxStart = (float)(-186.4) * (float)Math.Abs(Math.Cos(radStartPoint));
yyStart = bitmap.Height - (float)(-186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
}
else if (startPoint > 270 && startPoint < 360)
{
xStart = (float)(13.6) * (float)Math.Abs(Math.Cos(radStartPoint));
yStart = bitmap.Height - (float)(-13.6) * (float)Math.Abs(Math.Sin(radStartPoint));
xxStart = (float)(186.4) * (float)Math.Abs(Math.Cos(radStartPoint));
yyStart = bitmap.Height - (float)(-186.4) * (float)Math.Abs(Math.Sin(radStartPoint));
}

if (endPoint >= 0 && endPoint <= 90)
{
xEnd = (float)(13.6) * (float)Math.Abs(Math.Cos(radEndPoint));
yEnd = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
xxEnd = (float)(186.4) * (float)Math.Abs(Math.Cos(radEndPoint));
yyEnd = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radEndPoint));
}
else if (endPoint > 90 && endPoint <= 180)
{
xEnd = (float)(-13.6) * (float)Math.Abs(Math.Cos(radEndPoint));
yEnd = bitmap.Height - (float)(13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
xxEnd = (float)(-186.4) * (float)Math.Abs(Math.Cos(radEndPoint));
yyEnd = bitmap.Height - (float)(186.4) * (float)Math.Abs(Math.Sin(radEndPoint));
}
else if (endPoint > 180 && endPoint <= 270)
{
xEnd = (float)(-13.6) * (float)Math.Abs(Math.Cos(radEndPoint));
yEnd = bitmap.Height - (float)(-13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
xxEnd = (float)(-186.4) * (float)Math.Abs(Math.Cos(radEndPoint));
yyEnd = bitmap.Height - (float)(-186.4) * (float)Math.Abs(Math.Sin(radEndPoint));
}
else if (endPoint > 270 && endPoint < 360)
{
xEnd = (float)(13.6) * (float)Math.Abs(Math.Cos(radEndPoint));
yEnd = bitmap.Height - (float)(-13.6) * (float)Math.Abs(Math.Sin(radEndPoint));
xxEnd = (float)(186.4) * (float)Math.Abs(Math.Cos(radEndPoint));
yyEnd = bitmap.Height - (float)(-186.4) * (float)Math.Abs(Math.Sin(radEndPoint));
}

modelGraphic.FillRectangle(Brushes.White, 0, 0, 500, 500);
Rectangle rect = new Rectangle(100, 100, 200, 200);
modelGraphic.DrawEllipse(new Pen(Brushes.DarkOliveGreen, (float)(172.8)), rect);
modelGraphic.DrawEllipse(new Pen(Brushes.DarkGreen, (float)(144)), rect);
modelGraphic.DrawEllipse(new Pen(Brushes.ForestGreen, (float)(115.2)), rect);
modelGraphic.DrawEllipse(new Pen(Brushes.Green, (float)(86.4)), rect);
modelGraphic.DrawEllipse(new Pen(Brushes.LimeGreen, (float)(57.6)), rect);
modelGraphic.DrawEllipse(new Pen(Brushes.LightGreen, (float)(28.8)), rect);
modelGraphic.DrawEllipse(new Pen(Brushes.Black, 1), rect);
modelGraphic.DrawLine(new Pen(Brushes.White, 1), xStart+200, yStart-220, xxStart+200, yyStart-220);
modelGraphic.DrawLine(new Pen(Brushes.White, 1), xEnd+200, yEnd-220, xxEnd+200, yyEnd-220);
pictureBox1.Image = bitmap;
//DrawPoint(bitmap, modelGraphic, point, speed);

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

public void DrawPoint(Bitmap bitmap, Graphics modelGraphic, int point, int speed)
{
float rad = (float)(Math.PI * point / 180);
if (point >= 0 && point <= 90)
{
x = (float)13.6 * (float)Math.Abs(Math.Cos(rad));
y = bitmap.Height - (float)186.4 * (float)Math.Abs(Math.Sin(rad));
xx = ((float)13.6 + 3 * speed) * (float)Math.Abs(Math.Cos(rad));
yy = bitmap.Height - ((float)186.4 + 3 * speed) * (float)Math.Abs(Math.Sin(rad));
}
else if (point > 90 && point <= 180)
{
x = -(float)13.6 * (float)Math.Abs(Math.Cos(rad));
y = bitmap.Height - (float)186.4 * (float)Math.Abs(Math.Sin(rad));
xx = -((float)13.6 + 3 * speed) * (float)Math.Abs(Math.Cos(rad));
yy = bitmap.Height - ((float)186.4 + 3 * speed) * (float)Math.Abs(Math.Sin(rad));
}
else if (point > 180 && point <= 270)
{
x = -(float)13.6 * (float)Math.Abs(Math.Cos(rad));
y = bitmap.Height + (float)186.4 * (float)Math.Abs(Math.Sin(rad));
xx = -((float)13.6 + 3 * speed) * (float)Math.Abs(Math.Cos(rad));
yy = bitmap.Height + ((float)186.4 + 3 * speed) * (float)Math.Abs(Math.Sin(rad));
}
else if (point > 270 && point < 360)
{
x = (float)13.6 * (float)Math.Abs(Math.Cos(rad));
y = bitmap.Height + (float)186.4 * (float)Math.Abs(Math.Sin(rad));
xx = ((float)13.6 + 3 * speed) * (float)Math.Abs(Math.Cos(rad));
yy = bitmap.Height + ((float)186.4 + 3 * speed) * (float)Math.Abs(Math.Sin(rad));
}
if (speed > 0)
{
modelGraphic.DrawLine(new Pen(Brushes.Black, 4), x+200, y-133, xx+200, yy-133);
}
else
{
modelGraphic.DrawLine(new Pen(Brushes.Red, 4), x+200, y-133, xx+200, yy-133);
}
}

مثلا خط تو زاویه 90 سرعت 10 مثل شکل زیر رسم میشه 126790
ولی وقتی میخوام خط در زاویه 20 با سرعت 10 رسم بشه این شکلی میشه 126791
می خوام رسم این شکلی باشه 126792