Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗапискаКурицкая.doc
Скачиваний:
57
Добавлен:
16.03.2015
Размер:
7.98 Mб
Скачать

Приложение в Листинг основных модулей

В.1 Класс BatteryController

public class BatteryController

{

private List<Integer> testIds = new LinkedList<Integer>();

private int currentTestId = -1;

private TesteeMain testeeMain;

private Timer timer = null;

private int numberRepetsOZP = -1;

private boolean testShulte = false;

private boolean batteryEnd = false;

private Answers answersOZP = null;

public Answers getAnswersOZP() {

return answersOZP;

}

public void setAnswersOZP(Answers answersOZP) {

this.answersOZP = answersOZP;

}

public BatteryController(Battery battery,TesteeMain testeeMain)

{

this.testeeMain = testeeMain;

testIds.clear();

numberRepetsOZP = -1;

testShulte = false;

batteryEnd = false;

for (BatteryElement element : battery.getBatteryElements())

{

if (element.isTestEnabled())

{

if (element.getTestId()==11)

{

numberRepetsOZP = 0;

}else

{

if (element.getTestId()==12)

{

testShulte = true;

}else

{

testIds.add(element.getTestId());

}

}

}

}

currentTestId = 0;

}

public void startBattery()

{

batteryEnd = false;

if (!testIds.isEmpty())

{

if (testShulte)

{

testeeMain.beginTest(12);

}

if (numberRepetsOZP==0)

{

numberRepetsOZP++;

testeeMain.beginTest(11);

}

testeeMain.beginTest(testIds.get(currentTestId));

}

}

public boolean testEnds()

{

currentTestId++;

if (currentTestId < testIds.size())

{

testeeMain.beginTest(testIds.get(currentTestId));

return false;

}else

{

endBattery();

return true;

}

}

private void endBattery()

{

if (timer!=null) timer.stop();

batteryEnd = true;

if (testShulte)

{

testeeMain.beginTest(12);

}

if (numberRepetsOZP >= 0)

{

numberRepetsOZP++;

testeeMain.beginTest(11);

}

}

private void startTimer(int millis)

{

if(millis > 0)

{

System.out.println("бат timer sarts");

timer = new Timer(millis, new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

actionTimer();

}});

timer.setRepeats(false);

timer.start();

System.out.println("Timer start: seconds: "+(millis/1000)+new Date());

}

}

private void actionTimer()

{

numberRepetsOZP++;

testeeMain.beginTest(11);

}

public void OZPTestEnds()

{

if (numberRepetsOZP<4 && !batteryEnd)

{

switch(numberRepetsOZP)

{

case 1: {startTimer(5*60000); break;}

case 2: {startTimer(10*60000);break;}

case 3: {startTimer(53*60000);break;}

}

}else

{

if (batteryEnd)

{

double avg = 0;

for (Result result : answersOZP.getResults())

{

avg += Integer.parseInt(result.getValue());

}

avg = avg / answersOZP.getResults().size();

answersOZP.getAnswers().add(new Answer(1, ""+Math.round(avg*100D)/100D));

}

}

}

public boolean shouldShowWordsForOZP()

{

return (numberRepetsOZP<=1);

}

public int getNumberRepeatsOZP()

{

return numberRepetsOZP;

}

}

В.2 Класс CalculatorResultsForAizenk

public class CalculatorResultsForAizenk

{

private Map<Integer,Map<Integer,List<Integer>>> key = new HashMap<Integer, Map<Integer, List<Integer>>>();

private void initKey(){

//?

Map<Integer,List<Integer>> critKey = new HashMap<Integer, List<Integer>>();

critKey.put(1, Arrays.asList(1, 3, 8, 10, 13, 17, 22, 25, 27, 39, 44, 46, 49, 53, 56));

critKey.put(2, Arrays.asList(5, 15, 20, 29, 32, 34, 37, 41, 51));

key.put(1, critKey);

//L

critKey = new HashMap<Integer, List<Integer>>();

critKey.put(1, Arrays.asList(2, 4, 7, 9, 11, 14, 16, 19, 21, 24, 26, 28, 31, 33, 35, 38, 40, 43,45, 47, 50, 52, 55, 57));

critKey.put(2, new LinkedList<Integer>());

key.put(2, critKey);

//F

critKey = new HashMap<Integer, List<Integer>>();

critKey.put(1, Arrays.asList(6, 23, 36));

critKey.put(2, Arrays.asList(12, 18, 30, 42, 48, 54));

key.put(3, critKey);

}

public void calculate(Test currentTest,Answers currentAnswers)

{

initKey();

int k = -1;

for (Type type : currentTest.getTypes())

{

int resultValue = 0;

for (Answer answer : currentAnswers.getAnswers())

{

List<Integer> questionIds = key.get(type.getTypeId()).get(answer.getVariant_id());

if (questionIds.contains(answer.getQuestion_id()))

{

resultValue++;

}

}

currentAnswers.getResults().add(new Result(type.getTypeId(), ""+resultValue));

В.3 Класс GraphForAizenk

public class GraphForAizenk extends javax.swing.JFrame implements Printable

{

private static String[] scaleNames = {"1","2","3","4","5"};

Answers answers =null;

/** Creates new form GraphForDS */

public GraphForAizenk(Answers answers) {

this.answers = answers;

initComponents();

Toolkit kit = Toolkit.getDefaultToolkit();

setLocation((kit.getScreenSize().width /2) - (getWidth() / 2), (kit.getScreenSize().height / 2) - (getHeight()/2));

}

/** This method is called from within the constructor to

* initialize the form.

* WARNING: Do NOT modify this code. The content of this method is

* always regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jPanel1 = new javax.swing.JPanel();

jButton1 = new javax.swing.JButton();

setTitle("График результатов теста Айзенка"); // NOI18N

setIconImage(ProfessiogramApp.getIcon());

setMinimumSize(new java.awt.Dimension(200, 200));

setName("Form"); // NOI18N

jPanel1.setBackground(new java.awt.Color(255, 255, 255));

jPanel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));

jPanel1.setName("jPanel1"); // NOI18N

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);

jPanel1.setLayout(jPanel1Layout);

jPanel1Layout.setHorizontalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 551, Short.MAX_VALUE)

);

jPanel1Layout.setVerticalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 414, Short.MAX_VALUE)

);

jButton1.setFont(new java.awt.Font("Tahoma", 0, 14));

jButton1.setText("Распечатать"); // NOI18N

jButton1.setName("jButton1"); // NOI18N

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton1))

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addContainerGap()

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton1)

.addContainerGap())

);

pack();

}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

PrinterJob job = PrinterJob.getPrinterJob();

job.setPrintable(this);

boolean ok = job.printDialog();

if (ok) {

try {

job.print();

} catch (PrinterException ex) {

/* The job did not successfully complete */

}

}

}

@Override

public void paint(Graphics r)

{

super.paint(r);

Graphics g = jPanel1.getGraphics();

performPaintGraph(g,jPanel1.getWidth(),jPanel1.getHeight());

}

private Map<Integer,Integer> getMapResults(List<Result> results)

{

Map<Integer,Integer> res = new HashMap<Integer, Integer>();

for (Result result : results)

{

Integer resInte = Integer.valueOf(result.getValue());

res.put(result.getType_id(), resInte);

}

return res;

}

public int print(Graphics g, PageFormat pf, int page) throws PrinterException

{

if (page > 0) { /* We have only one page, and 'page' is zero-based */

return NO_SUCH_PAGE;

}

/* User (0,0) is typically outside the imageable area, so we must

* translate by the X and Y values in the PageFormat to avoid clipping

*/

Graphics2D g2d = (Graphics2D)g;

g2d.translate(pf.getImageableX(), pf.getImageableY());

double aspektRatio = ((double)jPanel1.getWidth())/((double)jPanel1.getHeight());

if (pf.getImageableHeight()*aspektRatio > pf.getImageableWidth())

{

performPaintGraph(g2d,pf.getImageableWidth(),pf.getImageableWidth()/aspektRatio);

}else

{

performPaintGraph(g2d,pf.getImageableHeight()*aspektRatio,pf.getImageableHeight());

}

/* Now we perform our rendering */

/* tell the caller that this page is part of the printed document */

return PAGE_EXISTS;

}

private void performPaintGraph(Graphics g, double widthArea,double heightArea)

{

Graphics2D g2 = (Graphics2D)g;

Map<RenderingHints.Key, Object> rem = new HashMap<RenderingHints.Key, Object>();

rem.put(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

rem.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

RenderingHints rh = new RenderingHints(rem);

g2.setRenderingHints(rh);

int footer = 40;

int left = 55;

int maxY = (int) Math.round(heightArea-footer);

int maxX = (int) Math.round(widthArea-left);

int maximum = 25;

Double stepX = (double) maxX / maximum;

Double stepY = (double)(maxY)/ maximum;

g2.setFont(new Font("Bookman Old Style", Font.PLAIN, 14));

g2.setStroke(new BasicStroke(2,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));

g2.drawLine(left, 0, left, maxY);

g2.drawLine(left, maxY, (int) Math.round(widthArea), maxY);

//Отрисовка подписей и сетки

for (int i = 1; i < maximum; i++)

{

g2.setColor(Color.lightGray);

if (i%2==0)

{

g2.drawLine(left, maxY - (int) Math.round(i*stepY), (int) Math.round(widthArea), maxY - (int) Math.round(i*stepY));

g2.drawLine(left+(int) Math.round(i*stepX), 0, left+(int) Math.round(i*stepX), maxY);

g2.setColor(Color.black);

g2.drawString(""+i, 30, (int) (maxY-(i-0.5)*stepY));

g2.drawString(""+i, (int) Math.round(left+((i-0.2)*stepX)), (int) Math.round(heightArea)-footer/2-5);

}

}

g2.drawLine(left-3, maxY - (int) Math.round(12*stepY), (int) Math.round(widthArea), maxY - (int) Math.round(12*stepY));

g2.drawLine(left+(int) Math.round(12*stepX), 0, left+(int) Math.round(12*stepX), maxY+3);

//Отрисовка названий

AffineTransform saveXform = g2.getTransform();

AffineTransform at = new AffineTransform();

at.translate(20, (maxY/2D)+70);

at.rotate(Math.toRadians(270));

g2.transform(at);

g2.drawString("Шкала нейротизма", 0, 0);

g2.setTransform(saveXform);

g2.drawString("Шкала экстраверсии", (int) Math.round(left+(maxX/2D)-70), (int) Math.round(heightArea)-footer/2+10);

g2.setColor(Color.white);

g2.fillRect(left+10, 10, 90, 10);

g2.fillRect(left+maxX-90, 10, 60, 10);

g2.fillRect(left+10, maxY-20, 80, 10);

g2.fillRect(left+maxX-90, maxY-20, 80, 10);

g2.setColor(Color.black);

g2.drawString("Меланхолик", left+10, 20);

g2.drawString("Холерик", left+maxX-90, 20);

g2.drawString("Флегматик", left+10, maxY-10);

g2.drawString("Сангвиник", left+maxX-90, maxY-10);

Map<Integer,Integer> res = getMapResults(answers.getResults());

//Отрисовка результата

g2.setColor(Color.red);

g2.setStroke(new BasicStroke(5,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));

g2.drawLine((int) Math.round(left+((res.get(1)-0.75)*stepX)),

(int) Math.round(maxY-(res.get(2))*stepY),

(int) Math.round(left+((res.get(1)+0.75)*stepX)),

(int) Math.round(maxY-(res.get(2))*stepY));

g2.drawLine((int) Math.round(left+((res.get(1))*stepX)),

(int) Math.round(maxY-(res.get(2)-0.75)*stepY),

(int) Math.round(left+((res.get(1))*stepX)),

(int) Math.round(maxY-(res.get(2)+0.75)*stepY));

В.4 Класс CalculatorResultsForDS

public class CalculatorResultsForDS

{

public static Set<Integer> inverted = new HashSet<Integer>(Arrays.asList(3,17,38,50));

public static Set<Integer> duplicated = new HashSet<Integer>(Arrays.asList(17,50,8,35));

public static List<Double> avgMale = new LinkedList<Double>(Arrays.asList(36.82,21.78,20.34,21.06,22.04,23.04,31.38,20.02));

public static List<Double> sigmMale = new LinkedList<Double>(Arrays.asList(7.52,5.97,7.81,7.15,8.71,8.7,8.88,5.89));

public static List<Double> avgFemale = new LinkedList<Double>(Arrays.asList(33.37,24.5,25.14,24.27,26.14,27.22,34.97,21.3));

public static List<Double> sigmFemale = new LinkedList<Double>(Arrays.asList(8.38,7.18,9.28,8.4,10.10,9.42,9.62,6.16));

public void calculate(Test currentTest,Answers currentAnswers, String sex)

{

for (Type type : currentTest.getTypes())

{

int resultValue = 0;

LinkedList<Integer> questionIds = currentTest.getQuestionsIdsByTypeId(type.getTypeId());

for (Answer answer : currentAnswers.getAnswers())

{

if (questionIds.contains(answer.getQuestion_id()))

{

if (type.getTypeId() == 2 && inverted.contains(answer.getQuestion_id()))

{

resultValue+=8-answer.getVariant_id();

}else

{

resultValue+=answer.getVariant_id();

}

}

}

if (type.getTypeId() == 2)

{

resultValue += currentAnswers.getAnswerByQuestionId(8).getVariant_id();

resultValue += 8 - currentAnswers.getAnswerByQuestionId(17).getVariant_id();

resultValue += 8 - currentAnswers.getAnswerByQuestionId(50).getVariant_id();

}

if (type.getTypeId() == 5)

{

resultValue += currentAnswers.getAnswerByQuestionId(35).getVariant_id();

}

Double avg;

Double sigm;

if ("M".equals(sex))

{

avg = avgMale.get(type.getTypeId()-1);

sigm = sigmMale.get(type.getTypeId()-1);

}else

{

avg = avgFemale.get(type.getTypeId()-1);

sigm = sigmFemale.get(type.getTypeId()-1);

}

if (type.getTypeId() == 1)

{

resultValue = (int) Math.round(50 + ((10*(resultValue-avg))/sigm));

}else

{

resultValue = (int) Math.round(50 - ((10*(resultValue-avg))/sigm));

}

currentAnswers.getResults().add(new Result(type.getTypeId(), ""+resultValue));

}

}

}

В.5 Класс GraphForDS

public class GraphForDS extends javax.swing.JFrame implements Printable

{

private static String[] scaleNames = {"Ак","Бо","То","Ра","Сп","Ус","Уд","По"};

Answers answers =null;

/** Creates new form GraphForDS */

public GraphForDS(Answers answers) {

this.answers = answers;

initComponents();

Toolkit kit = Toolkit.getDefaultToolkit();

setLocation((kit.getScreenSize().width /2) - (getWidth() / 2), (kit.getScreenSize().height / 2) - (getHeight()/2));

}

/** This method is called from within the constructor to

* initialize the form.

* WARNING: Do NOT modify this code. The content of this method is

* always regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jPanel1 = new javax.swing.JPanel();

jButton1 = new javax.swing.JButton();

setTitle("График результатов теста ДС"); // NOI18N

setIconImage(ProfessiogramApp.getIcon());

setMinimumSize(new java.awt.Dimension(200, 200));

setName("Form"); // NOI18N

jPanel1.setBackground(new java.awt.Color(255, 255, 255));

jPanel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));

jPanel1.setName("jPanel1"); // NOI18N

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);

jPanel1.setLayout(jPanel1Layout);

jPanel1Layout.setHorizontalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 459, Short.MAX_VALUE)

);

jPanel1Layout.setVerticalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 329, Short.MAX_VALUE)

);

jButton1.setFont(new java.awt.Font("Tahoma", 0, 14));

jButton1.setText("Распечатать"); // NOI18N

jButton1.setName("jButton1"); // NOI18N

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton1))

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addContainerGap()

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton1)

.addContainerGap())

);

pack();

}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

PrinterJob job = PrinterJob.getPrinterJob();

job.setPrintable(this);

boolean ok = job.printDialog();

if (ok) {

try {

job.print();

} catch (PrinterException ex) {

/* The job did not successfully complete */

}

}

}

@Override

public void paint(Graphics r)

{

super.paint(r);

Graphics g = jPanel1.getGraphics();

performPaintGraph(g,jPanel1.getWidth(),jPanel1.getHeight());

}

private Map<Integer,Integer> getMapResults(List<Result> results)

{

Map<Integer,Integer> res = new HashMap<Integer, Integer>();

for (Result result : results)

{

res.put(result.getType_id(), Integer.parseInt(result.getValue()));

}

return res;

}

public int print(Graphics g, PageFormat pf, int page) throws PrinterException

{

if (page > 0) { /* We have only one page, and 'page' is zero-based */

return NO_SUCH_PAGE;

}

/* User (0,0) is typically outside the imageable area, so we must

* translate by the X and Y values in the PageFormat to avoid clipping

*/

Graphics2D g2d = (Graphics2D)g;

g2d.translate(pf.getImageableX(), pf.getImageableY());

double aspektRatio = ((double)jPanel1.getWidth())/((double)jPanel1.getHeight());

if (pf.getImageableHeight()*aspektRatio > pf.getImageableWidth())

{

performPaintGraph(g2d,pf.getImageableWidth(),pf.getImageableWidth()/aspektRatio);

}else

{

performPaintGraph(g2d,pf.getImageableHeight()*aspektRatio,pf.getImageableHeight());

}

/* Now we perform our rendering */

/* tell the caller that this page is part of the printed document */

return PAGE_EXISTS;

}

private void performPaintGraph(Graphics g, double widthArea,double heightArea)

{

Graphics2D g2 = (Graphics2D)g;

Map<RenderingHints.Key, Object> rem = new HashMap<RenderingHints.Key, Object>();

rem.put(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

rem.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

RenderingHints rh = new RenderingHints(rem);

g2.setRenderingHints(rh);

g2.setStroke(new BasicStroke(2,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));

int footer = 25;

int left = 25;

int maxY = (int) Math.round(heightArea-footer);

int maxX = (int) Math.round(widthArea-left);

Double stepX = (double) maxX / 8D;

Double stepY = (double)(maxY)/70D;

g2.drawLine(left, 0, left, maxY);

g2.drawLine(left, maxY, (int) Math.round(widthArea), maxY);

g2.setColor(Color.gray);

for (int i = 1; i < 70; i++)

{

g2.drawLine(left, (int) Math.round(i*stepY*10), (int) Math.round(widthArea), (int) Math.round(i*stepY*10));

}

g2.setColor(Color.black);

g2.setFont(new Font("Tahoma", Font.PLAIN, 12));

for (int i = 0; i < 70; i++) {

g2.drawString(""+i*10, 10, (int) (maxY-i*stepY*10));

}

for (int i = 0; i < scaleNames.length; i++)

{

g2.drawString(scaleNames[i], (int) Math.round(left+((i+0.5)*stepX)), (int) Math.round(heightArea)-footer/2);

g2.drawLine((int) Math.round(left+((i+1)*stepX)), maxY-3, (int) Math.round(left+((i+1)*stepX)), maxY+3);

}

Map<Integer,Integer> res = getMapResults(answers.getResults());

int prev = -1;

for (int i = 1; i <= scaleNames.length; i++)

{

g2.fillOval((int) Math.round(left+((i-0.5)*stepX))-3,

(int) Math.round(maxY-res.get(i)*stepY)-3, 6, 6);

g2.drawString(""+res.get(i), (int) Math.round(left+((i-0.5)*stepX))-4,

(int) Math.round(maxY-res.get(i)*stepY)-10);

if (prev!=-1)

{

g2.drawLine((int) Math.round(left+((i-1.5)*stepX)),

(int) Math.round(maxY-prev*stepY),

(int) Math.round(left+((i-0.5)*stepX)),

(int) Math.round(maxY-res.get(i)*stepY));

}

prev = res.get(i);

}

}