मैं अपने bachelorthesis के लिए ऐसा कर लेंगे, मैं इसे इस तरह से किया था (यह सही नहीं है, लेकिन यह आप मदद कर सकता है):।
(मैं नीचे दिए गए कोड से कुछ महत्वहीन तरीकों/कार्य हटाया यह मुख्य रूप से यह वर्णन करने के लिए कि मैंने इसे कैसे देखा। आप उदाहरण के लिए एक सरल java.awt.Point द्वारा GRectangle क्लास को प्रतिस्थापित कर सकते हैं।)
प्रारंभिक विधि आपको एक उदाहरण देता है कि आप डेटा का अधिकतम और न्यूनतम मूल्य कैसे प्राप्त कर सकते हैं तो आप जानते हैं कि अपने डेटावैल => निर्देशांक को कैसे बदला जाए।
public class DotVisualisation extends Visualisation {
private ArrayList<GRectangle> m_points;
private Comparable[] m_data;
private Comparable m_maxValue;
private Comparable m_minValue;
private int MAX_HEIGHT; // max height in pixels of visualization
/**
* Creates a new DotVisualisation.<br>
* <br>
* This class is a runnable JComponent that will visualize data as a function.
* The visualisation will plot the data with X and Y coordinates on the window.
* The X coordinate of the point is index of the dataelement.
* The Y coordinate of the point is relative to the value of the dataelement.<br>
* <br>
* This visualisation should be used for medium and large arrays.
*
* @author David Nysten
*/
public DotVisualisation()
{
m_points = new ArrayList<GRectangle>();
MAX_HEIGHT = 150;
}
/**
* Returns the maximum supported dimension by this visualisation.
*
* @return The supported dimension.
*/
public static int getSupportedDimension()
{
return 1;
}
@Override
public Dimension getMaximumSize()
{
return getPreferredSize();
}
@Override
public Dimension getPreferredSize()
{
return new Dimension(m_points.size() + 2, MAX_HEIGHT + 6);
}
@Override
public Dimension getMinimumSize()
{
return getPreferredSize();
}
@Override
public void paintComponent(Graphics g)
{
for(int i = 0; i < m_points.size(); ++i)
m_points.get(i).paintComponent(g);
}
private void swap(int index, int index2) { // See below }
private void initialise()
{
findMinimum();
findMaximum();
m_points.clear();
double multiplier;
int x = 0, y = 0, h;
for(int i = 0; i < m_data.length; ++i)
{
if(m_data[i].compareTo(-1) <= 0)
h = 0;
else
{
Integer value = (Integer) m_data[i];
Integer min = (Integer) m_minValue;
Integer diff = (Integer) m_maxValue - min;
multiplier = MAX_HEIGHT/diff.doubleValue();
h = (int) ((value - min) * multiplier);
}
y = (int) (MAX_HEIGHT - h);
GRectangle r = new GRectangle(x, y, 1, 1); // 1, 1 = width and height
r.setColor(Color.BLACK);
m_points.add(r);
++x;
}
}
private void findMaximum()
{
Comparable max = null;
if(m_data.length > 0)
{
max = m_data[0];
for(int i = 1; i < m_data.length; ++i)
if(m_data[i].compareTo(max) > 0)
max = m_data[i];
}
m_maxValue = max;
}
private void findMinimum()
{
Comparable min = null;
if(m_data.length > 0)
{
min = m_data[0];
for(int i = 1; i < m_data.length; ++i)
if(m_data[i].compareTo(min) < 0)
min = m_data[i];
}
m_minValue = min;
}
}
खाते में यह लो: 150 पिक्सेल की ऊंचाई पर 0 और 150 के बीच विज्युअलाइजिंग पूर्णांकों सरल है। 150 की ऊंचाई पर 565 और 3544545 के बीच पूर्णांक के एक सेट को विज़ुअलाइज़ करना थोड़ा सा है।
पीएस: कोड एक्स-समन्वय के रूप में इनपुटएरे में तत्व की अनुक्रमणिका का उपयोग करता है।
पीएस: कक्षा इनपुटएरे (m_data चर) का संदर्भ रखती है लेकिन यह आवश्यक नहीं है, आपको केवल अपने अंक आरंभ करने की आवश्यकता है।
पीएस: मेरी "विजुअलाइजेशन" कक्षा जो सभी विज़ुअलाइजेशन द्वारा विस्तारित है, मूल रूप से एक जेपीनल है।
पीएस: उपरोक्त कोड सकारात्मक पूर्णांक के लिए लिखा गया है, इसलिए शायद नकारात्मक पूर्णांक को संभालने के लिए कुछ अतिरिक्त कोडिंग की आवश्यकता होगी;)।
फिर एल्गोरिदम के कार्यों को देखने के लिए, मैंने पर्यवेक्षक पैटर्न का उपयोग किया। एल्गोरिथ्म, उदाहरण के bubblesort के लिए, इस तरह देखा:
for(int i = 0; i < size(); ++i)
for(int j = 1; j < size(); ++j)
if(greaterThan(j - 1, j))
swap(j - 1, j);
कहाँ समारोह स्वैप के रूप में (सरलीकृत संस्करण फिर से) इस प्रकार परिभाषित किया गया था:
protected void swap(int index1, int index2)
{
if(index1 != index2)
{
incrementSwap(); // counting swaps and visualizing counter
m_command.clear();
m_command.setAction(Action.SWAP);
m_command.addParameter(index1);
m_command.addParameter(index2);
setChanged();
notifyObservers(m_command);
E temp = m_data[index1];
m_data[index1] = m_data[index2];
m_data[index2] = temp;
}
}
कहाँ मैं एक स्वैप कि मेरे पर्यवेक्षकों (दृश्यावलोकन) अधिसूचित इंडेक्स 1 और इंडेक्स 2 पर हुआ। M_command चर कमांड-क्लास का एक उदाहरण है (इसे स्वयं लिखा है) जो विज़ुअलाइज़ेशन द्वारा आवश्यक जानकारी के लिए सिर्फ एक रैपर है। जो है: जो कार्रवाई हुई और प्रासंगिक जानकारी (उदाहरण के लिए स्वैप-एक्शन के लिए सूचकांक)।
तो विज़ुअलाइज़ेशन में मैंने उन इंडेक्स पर जीईक्टेंगल को और उनके एक्स-निर्देशांक के रूप में बदल दिया;
private void swap(int index, int index2)
{
if(index == index2)
return;
GRectangle r1 = m_points.get(index);
GRectangle r2 = m_points.get(index2);
int tempX = r1.getX();
r1.setLocation(r2.getX(), r1.getY());
r2.setLocation(tempX, r2.getY());
m_points.set(index, r2);
m_points.set(index2, r1);
}
आप इस तरह लाइनों जोड़ सकते हैं:
try {
Thread.sleep(100);
} catch(InterruptedException ignore) {}
continueing से पहले एक धागा नींद 100ms जाने के लिए।यह आसान हो सकता है अगर यह बहुत तेजी से कल्पना हो रही है।
तो यादृच्छिक पूर्णांकों के साथ एक सरणी के लिए यह इस प्रकार दिखाई देंगे:
और छँटाई के बाद: (बेशक यह एक सीधी रेखा नहीं है क्योंकि inputarray में मानों इस में यादृच्छिक पर उत्पन्न किया गया मामले)
तो तुम करने के लिए है, तो - जैसे मैं ही था - कई एल्गोरिदम एक ही दृश्य के साथ काम करने की अनुमति है, मैं यह कर सकते हैं सिफारिश विज़ुअलाइज़ेशन क्लास और एल्गोरिदम क्लास को अलग करने के लिए आपको एक पर्यवेक्षक पैटर्न के साथ काम करने के लिए संशोधित करने के लिए जब भी कोई कार्रवाई होती है (सेट, स्वैप, ...)।
और फिर आप तुलना के लिए ऐसा कुछ बना सकते हैं;
http://i445.photobucket.com/albums/qq179/ultddave/DotVisualizationMany_zps63269d2a.png http://i445.photobucket.com/albums/qq179/ultddave/DotVisualizationMany2_zps65e96fa9.png
गुड लक!