עזרה עם פרויקט בית ספר - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה עם פרויקט בית ספר


swipe

Recommended Posts

תראו יש לנו בבית ספר מגמה שבה אנו צריכים להכין פרויקט בשפה : C#

עכשיו

נתקלתי בכמה בעיות עם הפרויקט

קודם כל זה הקישור אליו:

http://www.mytempdir.com/1294965

הבעיות:

שאני מצייר פונקציה.. היא עוברת את הגבולות של הPANNEL

-המערכת צירים והגרפים נמחקים שעוברים את גבולות המסך, או שעולים על התוכנית .

-חישוב פונקצית ^. אם אתם יכולים לראות שעושים x^2 אז זה מצייר מצד החיובי של ציר X כמו שצריך וצד שמאל לכוון למטה..

הוא כאילו חושב שכל הפונקציה מינוס.. :\

-יחסים של הצירים.. הגרפים נראים קטנים ורציתי לדעת איך אני עושה "ZOOM" בשביל לראות את הגרף יותר גדול.. זאת אומרת להגדיל רזולוציה אבל רק ל- PANEL של הגרף.

-משהו מתפקשש שאני מחשב פונקצית TANx וזה קשור ל-DLL..

הDLL לקחתי מהאינטרנט זה בעצם נותן לי אפשרות לחשב כל משוואה.. (אבל בלי X) את האפשרות של החלפת X במספר אני הוספתי וזה יוצר לי כמה בעיות

חשבתי אולי תוכלו לעבור על התוכנית ולעזור לי לתקן את הבעיות

אני אשמח לעזרה.. כי זה כבר דחוף חח

תודה, נימרוד

קישור לתוכן
שתף באתרים אחרים

לא קראתי את הקו שלך, אך יתכן שיהיו לי פתרונות לחלק מהבעיות שלך:

1) נפתח כאן לא מזמן תרד שעסק בנושא של הציור שנעלם. תחפש אותו.

2) Y=0 נמצא בחלק העליון של המסך ולא בחלק התחתון. הערכים בידיוק הפוכים ממערכת צירים רגילה. כדי לקבל את הY החדש אתה צריך לעשות A-y כאשר A מציין את המיקום של ציר הX במסך(שיעור הY שלו), וY הוא הY של הפונקציה. אולי זו הבעיה שלך.

3) אמרת שיש לך DLL שמחשב ערכים של פונקציה. למה שלא תשלח לה תחום ערכים אחר(למשל תחום ערכים פי 3 יבצע זום ב-3), ובסוף תכפיל את הערכים שהתקבלו ב3 כדי שהזום יתבצע גם על הY.

אם יש לך בעיות יותר ספציפיות עם קוד ספציפי תרשום אותו כאן(בצורה מצומצמת, אין לי כוח לקרוא את כל הקוד של הפרוייקט).

קישור לתוכן
שתף באתרים אחרים

לא קראתי את הקו שלך, אך יתכן שיהיו לי פתרונות לחלק מהבעיות שלך:

1) נפתח כאן לא מזמן תרד שעסק בנושא של הציור שנעלם. תחפש אותו.

2) Y=0 נמצא בחלק העליון של המסך ולא בחלק התחתון. הערכים בידיוק הפוכים ממערכת צירים רגילה. כדי לקבל את הY החדש אתה צריך לעשות A-y כאשר A מציין את המיקום של ציר הX במסך(שיעור הY שלו), וY הוא הY של הפונקציה. אולי זו הבעיה שלך.

3) אמרת שיש לך DLL שמחשב ערכים של פונקציה. למה שלא תשלח לה תחום ערכים אחר(למשל תחום ערכים פי 3 יבצע זום ב-3), ובסוף תכפיל את הערכים שהתקבלו ב3 כדי שהזום יתבצע גם על הY.

אם יש לך בעיות יותר ספציפיות עם קוד ספציפי תרשום אותו כאן(בצורה מצומצמת, אין לי כוח לקרוא את כל הקוד של הפרוייקט).

הקוד של הפרויקט הזה ממש קצר..

ככה שלא בעיה לקרוא אותו

לגבי 1.

דיברו שם על BITMAP

ואני ממש מצייר ב-C#.. לא מוסיף תמונה כלשהי.. ככה שאין לי מושג איך לסדר.. אם תוכל לפשט לי את העניין אולי אני יבין.

2. לא כל כך הבנתי למה אתה מתכוון

3. ניסיתי לעשות את מה שאמרת. אבל צריך גם לשנות את הגודל של X ו Y ביחד לא? :|

קישור לתוכן
שתף באתרים אחרים

1) הרעיון הוא שאתה צריך להוסיף לPAINT של הFORM את הפונקציה שמציירת את הגרף הנוכחי. בלי קשר לBITMAP או לא.

2) על המחשב, ככל שערך הY גדול יותר, כך הנקודה תהייה נמוכה יותר. ציר הY הפוך. תראה את התמונה שהוספתי.

3) אם יש לך פונקציה

f(x)

אז

f(ax)

מותח בציר הX

ו

bf(x)

מותח בציר הY

bf(ax)

מותח בשניהם.

תשחק עם זה.

[attachment deleted by admin]

קישור לתוכן
שתף באתרים אחרים


private void button1_Click(object sender, EventArgs e)
{
MathParser.Parser theParser = new Parser();
string theFunction = textbox.Text;
//theParser.Evaluate(theFunction);
//Console.WriteLine(theParser.Result);
//Console.ReadLine();
Graphics g = CreateGraphics();
Brush myBrush = new SolidBrush(Color.Black);
Pen myPen = new Pen(myBrush);
string fun = textbox.Text;
int x0 = System.Convert.ToInt32(panel1.Width / 2);
int y0 = System.Convert.ToInt32(panel1.Height / 2);
int yT = 0;
int xT = 0;
double stretchH = 1, stretchW = 0.05;
for (int i = -x0; i <= x0; i++)
{
theFunction = fun.Replace("x", "(" + (i * stretchW) + ")");
theParser.Evaluate(theFunction);
double d = stretchH * theParser.Result;
int y1 = System.Convert.ToInt32(d);
if (i != -x0)
{
g.DrawLine(myPen, panel1.Left + panel1.Width / 2 + xT + 1,
panel1.Top + panel1.Height / 2 - yT,
panel1.Left + panel1.Width / 2 + i + 1,
panel1.Top + panel1.Height / 2 - y1);
}
yT = y1;
xT = i;
//g.DrawRectangle(myPen, panel1.Left + panel1.Width / 2 + i, panel1.Top + panel1.Height / 2 - y1, 0, 0);
}
}
}

קישור לתוכן
שתף באתרים אחרים


private void button1_Click(object sender, EventArgs e)
{
MathParser.Parser theParser = new Parser();
string theFunction = textbox.Text;
//theParser.Evaluate(theFunction);
//Console.WriteLine(theParser.Result);
//Console.ReadLine();
Graphics g = CreateGraphics();
Brush myBrush = new SolidBrush(Color.Black);
Pen myPen = new Pen(myBrush);
string fun = textbox.Text;
int x0 = System.Convert.ToInt32(panel1.Width / 2);
int y0 = System.Convert.ToInt32(panel1.Height / 2);
int yT = 0;
int xT = 0;
double stretchH = 1, stretchW = 0.05;
for (int i = -x0; i <= x0; i++)
{
theFunction = fun.Replace("x", "(" + (i * stretchW) + ")");
theParser.Evaluate(theFunction);
double d = stretchH * theParser.Result;
int y1 = System.Convert.ToInt32(d);
if (i != -x0)
{
g.DrawLine(myPen, panel1.Left + panel1.Width / 2 + xT + 1,
panel1.Top + panel1.Height / 2 - yT,
panel1.Left + panel1.Width / 2 + i + 1,
panel1.Top + panel1.Height / 2 - y1);
}
yT = y1;
xT = i;
//g.DrawRectangle(myPen, panel1.Left + panel1.Width / 2 + i, panel1.Top + panel1.Height / 2 - y1, 0, 0);
}
}
}

תראה.. ניסיתי ויש עם זה בעיות

קודם כל זה לא מצייר כמו שצריך פרבולה וכו'

וגם אתה פשוט הכפלת את X ו Y

וזה לא נכון

כי אם תנסה את הפונקציה הכי פשוטה "X" תראה שיצא לך שיפוע שגוי.

בכל מקרה תראה מה אני ניסיתי לעשות

עדכון:

http://www.mytempdir.com/1298013

ניסיתי כבר יומיים לעבוד על המערכת של ה- ZOOM

ויש לי בעיות איתה

זה כאילו יש לו בעיה עם מיספרים לא שלמים (בחישוב)

הקלאס שאני משתמש בוא כן מחשב מספרים לא שלמים ככה שזה ממש מוזר.

זה לא בעיה עם הקלאס.

אבל משום מה זה לא מצייר נכון.. אני פשוט עובד על זה ממש הרבה ולא מצליח לפתור.

אשמח אם מישהו יעיף מבט ויגיד לי מה הבעיה.

קישור לתוכן
שתף באתרים אחרים

טוב..

הצלחתי לפתור את הבעיה של ה- ZOOM

אחרי שדיברתי עם 2 אנשים שמנוסים ממש בזה חח איזה שעה ככה

עכשיו אני מנסה לעבוד על הגבולות...

למישהו יש הצעה איך לעשות את זה יעיל ומהיר?

קישור לתוכן
שתף באתרים אחרים

1) מה הכוונה בגבולות?

2) אל תשלח DOUBLE POST. זה אסור בחוקי הפורום.

3) איך פתרת את הבעיה?

1. זאת אומרת שהציור של הגרף לא יעבור את גבולות ה- PANEL.

2. סליחה לא ידעתי לא יקרה שוב.

3. תראה זה קצת יותר מוכב וגם היית בעיה עם מספרים לא שלמים ב- תוצאה של הפונקציה

הנה התשובה

    private void button1_Click(object sender, EventArgs e)
{
Function fn = new Function();
MathParser.Parser theParser = new Parser();
string theFunction = textbox.Text;
Graphics g = CreateGraphics();
Brush myBrush = new SolidBrush(Color.Black);
Pen myPen = new Pen(myBrush);
string fun = textbox.Text;
float gridx = System.Convert.ToInt32(panel1.Left + panel1.Width / 2);
float gridy = System.Convert.ToInt32(panel1.Top + panel1.Height / 2);
float yT = 0;
float i;
for (i = -(270 / zoom); i <= (270 / zoom); i = i + (((float)0.27) / zoom))
{

float num = i + (1 / zoom);
float num1 = i;

theFunction = fun.Replace("x", num1.ToString());
fn.Parse(theFunction);
fn.Infix2Postfix();
fn.EvaluatePostfix();
double nResult = fn.Result;
float y1 = (float)nResult;

theFunction = fun.Replace("x", num.ToString());
fn.Parse(theFunction);
fn.Infix2Postfix();
fn.EvaluatePostfix();
nResult = fn.Result;
float y2 = (float)nResult;

if (i > -(panel1.Width / 2) / zoom)
{
g.DrawLine(myPen,
(gridx) + (i * zoom), //point x1
(gridy) - (yT * zoom), //point y1
(gridx) + (i + 1 / zoom) * zoom, //point x2
(gridy) - (y2 * zoom)); //point y2
}
yT = y1;

}

או פה: http://rafb.net/p/RGALs477.html

יש עכשיו בעיה שאני לא כל כך מבין אותה.

אני שם כל פונקציה שהיא

וכשהיא מגיעה קרוב ל-0 זה קופץ לי למעלה\למטה ואני עדיין לא מבין למה זה קורה..

אם בא לך להעיף מבט אני אשמח

הנה התוכנית המעודכנת:

http://www.mytempdir.com/1298714

קישור לתוכן
שתף באתרים אחרים

דרך אגב, הערה שלא קשורה לבעיה שלך: אתה לא משחרר כמו שצריך את האובייקטים הגרפיים (כמו Brush, Pen, Graphics).

אובייקטים כאלה מקצים שלא משתחרר אוטומטית על ידי ה GC ולכן אתה צריך לקרוא למתודה Dispose של כל אחד מהם אחרת אתה "מדליף" (לא משחרר אחרי שהתוכנית נסגרת).

קישור לתוכן
שתף באתרים אחרים

דרך אגב, הערה שלא קשורה לבעיה שלך: אתה לא משחרר כמו שצריך את האובייקטים הגרפיים (כמו Brush, Pen, Graphics).

אובייקטים כאלה מקצים שלא משתחרר אוטומטית על ידי ה GC ולכן אתה צריך לקרוא למתודה Dispose של כל אחד מהם אחרת אתה "מדליף" (לא משחרר אחרי שהתוכנית נסגרת).

לא הבנתי כל כך מה אתה מסביר פה.. שאני מאבד זכרון?

ומישהו יכול לעזור לי עם זה שהציור של הפונקציה והגבולות לא יעלם?

קישור לתוכן
שתף באתרים אחרים

תסתכל על הקוד הזה. בכל מקרה, הסיבה לבעיה שיש לך היא אי יציבות נומרית בזמן החישוב (החילוק שאתה עושה בקוד זום כנראה קרוב לאפס יוצא לא מדויק בכלל).

[attachment deleted by admin]

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...