ABA


"JAVA| איך אני מאפשר ציור מהיר יותר?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10894 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10894
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   19:47   20.09.12   
אל הפורום  
  JAVA| איך אני מאפשר ציור מהיר יותר?  
 
יצרתי מין לוח ציור כזה, פשוט למדי, וכדי לאפשר ציור עשיתי שכל לחיצה או גרירה של העכבר תיצור אובייקט חדש של נקודה, ובסוף אני מצייר את כל הנקודות שנוצרו עד כה.
את הנקודות הוספתי באמצעות ArrayList שכל פעם קיבל עוד נקודה חדשה, כשלכל נקודה יש את פונקציית הציור שלה, ביחד עם המיקום שהיא נוצרה.

הבעיה היא שזה לא מספיק מהיר, כי הציור לא יוצא אחיד:

איפה שהקו נראה אחיד פשוט עברתי יותר לאט, ככל שיותר מהר הנקודות מתרחקות.

עבדתי עם CANVAS, ולא הוספתי שום דיליי בציור, אפילו של מילישנייה.

תודה


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  תעלה את הקוד, אני חושב שאז יהיה אפשר לכוון אותך יותר :) יוחאי 20.09.12 20:43 1
     אז ככה, asco88  20.09.12 21:17 4
  אני חושב שקצת הגזמת פה... לשמור כל נקודה ונקודה על ה-CANVAS Ice Cold  20.09.12 21:00 2
     אני בטוח שזה מוגזם asco88  20.09.12 21:12 3
  הסבר Net_Boy  20.09.12 22:39 5
     תודה רבה! asco88  20.09.12 22:42 6
     איך זה עובד עם קווים שהם לא ישרים? יוחאי 20.09.12 22:57 7
         ככל שהשיפוע משתנה, Windows ישלח יותר אירועים Net_Boy  20.09.12 23:20 8
         תראה פה: asco88  20.09.12 23:42 9
             פה נכנס לתמונה ה Anti-aliasing dvir8 27.09.12 11:39 10
                 מידע נוסף תוכל למצוא במצגות של הקורס הזה: Zippo  28.09.12 16:52 11

       
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   20:43   20.09.12   
אל הפורום  
  1. תעלה את הקוד, אני חושב שאז יהיה אפשר לכוון אותך יותר :)  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   21:17   20.09.12   
אל הפורום  
  4. אז ככה,  
בתגובה להודעה מספר 1
 
זאת המחלקה העיקרית שמטפלת במסך:

import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JPanel;

public class ScreenPanel extends JPanel implements Runnable {

private Thread thread = new Thread(this);

private Dimension mainSize;
public static ArrayList <Dot> dots;

private boolean isFirst = true;

public ScreenPanel() {
mainSize = Main.getMainSize();
thread.start();
}

public void init() {
dots = new ArrayList <Dot>();
}

public void paintComponent(Graphics g) {

DrawThis.draw(g, "bg");
DrawThis.draw(g, "board");

if (!dots.isEmpty()) {
for (Dot d : dots) {
d.draw(g);
}
}


}

@Override
public void run() {

while(true) {

if (isFirst) {
init();
isFirst = false;
}

repaint();
}
}



}

זאת הנקודה:

import java.awt.*;

public class Dot extends Rectangle {

public Dot (int x, int y) {
setBounds (x, y, 5, 5);
}

public void draw(Graphics g) {
g.setColor(Color.BLACK);
g.fillOval(x, y, width, height);
}

}

וכאן אני מנתח כל שימוש בעכבר:

import java.awt.event.*;

public class MouseHandler implements MouseListener, MouseMotionListener {

@Override
public void mouseDragged(MouseEvent e) {
ScreenPanel.dots.add( new Dot (e.getX(), e.getY()) );
}

@Override
public void mouseMoved(MouseEvent e) {
}

@Override
public void mouseClicked(MouseEvent e) {
ScreenPanel.dots.add( new Dot (e.getX(), e.getY()) );
}

@Override
public void mouseEntered(MouseEvent e) {
}

@Override
public void mouseExited(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

}

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

תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Ice Cold  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 3.8.02
28041 הודעות, 19 פידבק
   21:00   20.09.12   
אל הפורום  
  2. אני חושב שקצת הגזמת פה... לשמור כל נקודה ונקודה על ה-CANVAS  
בתגובה להודעה מספר 0
 
נראה לי מוגזם לגמרי...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   21:12   20.09.12   
אל הפורום  
  3. אני בטוח שזה מוגזם  
בתגובה להודעה מספר 2
 
איך עוד אפשר לשמור את כל הנקודות בלי לאבד מיקום, וגם בלי לשמור כנקודות בנפרד?
חשבתי לעשות מחלקה שמציירת לבד את כל הנק' בהתאם למה שנשמר, אבל עדיין, כל נקודה תשמר בנפרד.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   22:39   20.09.12   
אל הפורום  
  5. הסבר  
בתגובה להודעה מספר 0
 
   Windows לא מעביר את כל הקורדינאטות שעוברות מנקודה A ל-B.
אם תעשה את זה מאד לאט, אז אתה בהחלט תקבל את כולם אבל כשאתה מזיז את העכבר מהר, Windows מעיף לך כמה נקודות באמצע (מטעמי Performance).

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

זה אמור לתת לך אפקט כמו שיש בצייר.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   22:42   20.09.12   
אל הפורום  
  6. תודה רבה!  
בתגובה להודעה מספר 5
 
עובד פיקס


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   22:57   20.09.12   
אל הפורום  
  7. איך זה עובד עם קווים שהם לא ישרים?  
בתגובה להודעה מספר 5
 
   סתם מעניין לדעת!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:20   20.09.12   
אל הפורום  
  8. ככל שהשיפוע משתנה, Windows ישלח יותר אירועים  
בתגובה להודעה מספר 7
 
   זאת אומרת אם תעשה תנועות מעגליות עם העכבר, ישלחו הרבה מאד Events
לעומת זאת, אם תזיז את העכבר בקו ישר אז אין ל- Windows באמת צורך לשלוח הרבה.

ככל שיש יותר אירועים אז הקירוב של הקווים יתן לך בעין צורה שקרובה למעגלית
למרות שהבהקשר של ציור, זה יראה מאד מפוקסל לכן בד"כ עושים Anti aliasing
ואז הצורה נראית הרבה יותר נעימה לעין.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   23:42   20.09.12   
אל הפורום  
  9. תראה פה:  
בתגובה להודעה מספר 7
 
אחרי שעברתי לצייר קו בין הנקודות במקום את הנקודות עצמם, אפשר לראות שהקו אחיד, אבל אפשר גם בקלות לראות את הנקודות עצמן:

רק כאשר הקו ישר, הוא נראה מושלם


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   11:39   27.09.12   
אל הפורום  
  10. פה נכנס לתמונה ה Anti-aliasing  
בתגובה להודעה מספר 9
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   16:52   28.09.12   
אל הפורום  
  11. מידע נוסף תוכל למצוא במצגות של הקורס הזה:  
בתגובה להודעה מספר 10
 
לקחתי את הקורס בלימודים לתואר ראשון.
http://u.cs.biu.ac.il/~kapaho/CG

בסוף המצגת הזאת: http://u.cs.biu.ac.il/~kapaho/CG/02_Draw2D.pdf
יש לך הסברון על אנטי אליאסינג.

אם זה לצורך לימודי, אני יכול להמליץ לך לעשות את התרגילים. הם מאד מלמדים


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net