2012-01-25 13 views
9

मैं पिक्सल स्थिति का उपयोग (1 या छोरों के लिए 2) के साथ एक चक्र आकर्षित करने के लिए चाहते हैं (पाश के लिए के साथ एक छवि में लागू पिक्सल का प्रयोग करके) (ऊपरी बाएं से शुरू होता है और सही तल पर समाप्त होता है)ड्रा चक्र

मैं सफलतापूर्वक इस विधि के साथ एक आयताकार खींचा:

private void drawrect(int width,int height,int x,int y) { 
    int top=y; 
    int left=x; 

    if(top<0){ 
     height+=top; 
     top=0; 
     } 
    if(left<0){ 
     width+=left; 
     left=0; 
    } 

    for (int j = 0; j <width; j++) { 
     for (int i = 0; i <height; i++) { 
        pixels[((i+top)*w)+j+left] = 0xffffff;//white color 
     } 

    } 

} 

पिक्सेल सरणी में इसके रंग के बाद पिक्सेल इंडेक्स होता है।

pixels[index]=color; 

कि इससे पहले कि मैं (यदि यह आप में मदद करता है)

img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); 

लेकिन कैसे मैं इस छवि में जैसे ही सफेद पिक्सल आकर्षित और अनदेखा कर सकते हैं "छवि" और "पिक्सल" सरणी के लिए इस कोड का उपयोग अन्य पिक्सल?

Pixel Image http://oi42.tinypic.com/2u61sud.jpg

+1

आप शायद गूगल करना चाहते हैं, एल्गोरिथ्म :-) – BRFennPocock

उत्तर

1

देरी इस कोड के लिए खेद है पूरी तरह से काम करता है

private void drawcircle(int x,int y,int radius){ 
    for(int i=x;i<radius*2;i++) 
     for(int j=x;j<radius*2;j++){ 
      int d= (int) Math.sqrt((i-radius)*(i-radius)+(j-radius)*(j-radius)); 
       if(d<radius) 
        pixels[i+j*WIDTH]=346346; 
     } 

} 
+2

डबल लूप धीमा है, आप एक ही काम करने के लिए एक लूप का उपयोग कर सकते हैं। प्रदर्शन को और बढ़ाने के लिए, आप दो समरूपता का शोषण करके चार गुना कम वर्ग और स्क्वायरूट ऑपरेशन कर सकते हैं। –

+0

टिप के लिए धन्यवाद! – boyd

+0

यदि आपको केवल contour करने की आवश्यकता है: यदि (डी> = त्रिज्या -1 && डी <त्रिज्या + 1) img.SetPixel (i, j, color.White); –

0

एक तरह से यह करने के लिए परीक्षण करने के लिए, आयत में प्रत्येक बिंदु के लिए, या नहीं, वर्ग के केंद्र के लिए कि पिक्सेल से दूरी वृत्त की त्रिज्या का इरादा से भी कम है किया जाएगा। फिर आप उन पिक्सेल को खींच सकते हैं जो परीक्षण पास करते हैं और पिक्सल को छोड़ते हैं जो नहीं करते हैं। सर्कल के क्षेत्रफल का कुल वर्गफल क्षेत्रफल का अनुपात π/4 है, जो लगभग 77 है, इसलिए यह वास्तव में अक्षम नहीं है।

यदि आप आयताकार अंडाकार को आयत में फिट करना चाहते हैं, तो आप इस विचार का उपयोग कर सकते हैं, लेकिन गणना को संशोधित करेंगे जो केंद्र की दूरी निर्धारित करेगा जैसे कि आप लंबी धुरी के अनुपात में कम वजन देते हैं अंडाकार

आशा है कि इससे मदद मिलती है!

4

चूंकि आपके पास पहले से ही BufferedImage है, तो इसके लिए ग्राफिक्स ऑब्जेक्ट क्यों न बनाएं और सर्कल को आकर्षित करने के लिए इसका उपयोग क्यों करें? इस तरह आप पहिया बदलने की जरूरत नहीं है:

BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = img.createGraphics(); 
    g.setColor(Color.WHITE); 
    g.fillOval(x, y, width, height); 

अद्यतन

यहाँ एक SSCCE है:

:

public class DrawCircleExample extends Canvas { 
    private static final int WIDTH = 32; 
    private static final int HEIGHT = 32; 

    public static void main(String[] args) { 
     JFrame f = new JFrame("Draw circle example"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new DrawCircleExample()); 
     f.pack(); 
     f.setVisible(true); 
    } 

    private final BufferedImage img; 

    public DrawCircleExample() { 
     img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = img.createGraphics(); 
     g.setColor(Color.WHITE); 
     g.fillOval(8, 8, 14, 14); 
    } 

    @Override 
    public void paint(Graphics g) { 
     g.drawImage(img, 0, 0, null); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(img.getWidth(),img.getHeight()); 
    } 
} 

यह इस तरह एक छवि का निर्माण करना चाहिए Example output from circle example

+0

मैं नहीं जानता कि क्यों लेकिन मैं oval.My फ्रेम नहीं देख सकते हैं के लिए "Bresenham सर्कल" खाली है। बीटीडब्ल्यू। प्रतिपादन के लिए मैं अपने फ्रेम – boyd

+0

की तरह कल्पना की जा रहा हूं, मैंने परीक्षण कोड जोड़ा जो मैं एक उदाहरण के रूप में उपयोग कर रहा था। क्या उससे मदद हुई? –

+0

मैं f.add (class_object) का उपयोग कर रहा हूं, इसलिए इस वजह से कुछ भी काम नहीं करता है।इसे अपने कोड में जोड़ें DrawCircleExample सर्कल = नया DrawCircleExample(); f.add (सर्कल); लेकिन सार्वजनिक कक्षा के पास लिखें DrawCircleExample यह कैनवास – boyd

3

यहाँ पिक्सल के साथ वृत्त खींचने के लिए कोड है: यह सूत्र xend = x + आर क्योंकि (कोण) और yend = y + r पाप (कोण) का उपयोग करता है ।

#include <stdio.h> 
#include <graphics.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <bios.h> 
#include <math.h> 

void DrawCircle(int x, int y, int r, int color) 
{ 
     static const double PI = 3.1415926535; 
     double i, angle, x1, y1; 

     for(i = 0; i < 360; i += 0.1) 
     { 
      angle = i; 
      x1 = r * cos(angle * PI/180); 
      y1 = r * sin(angle * PI/180); 
      putpixel(x + x1, y + y1, color); 
     } 
} 

संदर्भ: http://www.softwareandfinance.com/Turbo_C/DrawCircle.html

+0

'bios.h',' graphics.h' ... गंभीर रूप से अनावश्यक निर्भरताओं के टन। और इसके शीर्ष पर आपके पास 'math.h' है, जिसमें पीआई स्थिर है, फिर भी आप अपना खुद का परिभाषित करते हैं ... – rbaleksandar

+0

यदि आपका सर्कल बहुत बड़ा है, तो यह काम नहीं करेगा; आपको बस एक सर्कल में 360 अंकों की व्यवस्था होगी जिसमें कुछ भी नहीं है। – ostrichofevil

संबंधित मुद्दे