I'm new to java and decided to make a program that : sets a point in the window when you left click. And then another point when you click again. And so on... Then it joins all the points up with lines and shades a side of the line depending on how many points are on a side of a line.( like this )
QUESTION STARTS HERE:
Now I need one more feature. When I right click , I want the transparency of the pixel at the mouse co-ordinates to appear. So when clicked in the middle it will show me that it's more transparent( or darker ) than when I right click the light areas.
I did some googling but couldn't find the answer.The closest I got to was create a screenshot with robot and use that as a bufferimage and then analyse the pixels that way. However I does not seem to work since wherever I right click I get 255,255,255,255 for ARGB. And sometimes weird stuff like 255,234,236,245 for AGBA.
Hope you can follow what I'm trying to do.
Here's my code.
My Main class which stars the program creates the window and does the mouse interface:
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.*;
import java.awt.image.BufferedImage;
public class mouse {
static DataTransfer data = new DataTransfer();
private static int x,y ;
private static draw object = new draw();
public static int numPoints = 0;
public static final int maxPoints = 4;
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame();
Robot robot = new Robot();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Drawing");
frame.setSize(500, 400 );
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.add(object);
data.getRobot(robot,frame.getSize());
object.addMouseListener(new AL() );
}
public static class AL extends MouseAdapter {
public void mouseClicked( MouseEvent e){
if (e.getButton() == MouseEvent.BUTTON1)
{
if (numPoints < maxPoints){
x = e.getX();
y = e.getY();
object.drawing(x,y,numPoints);
System.out.println("NUMBRER"+numPoints);
numPoints++;
}
}
if (e.getButton() == MouseEvent.BUTTON3)
{
x = e.getX();
y = e.getY();
int pixel = data.getScreen().getRGB(x, y);
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
}
}
}
// Here I tried to access the Robot in the mouse class, but I couldn't so I had to create this transition class in hope of it working
public static class DataTransfer{
BufferedImage screen ;
public void getRobot(Robot robot,Dimension size)
{
screen = robot.createScreenCapture(new Rectangle( size ));
}
public BufferedImage getScreen(){
return screen;
}
}
}
And my Graphics class which deals with the shading and line drawing etc... ( most of it repeats itself for each case of the shading , so you don't need to read the whole thing )
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class draw extends JPanel {
int[] polX = new int[5];
int[] polY = new int[5];
int[] aX = new int[mouse.maxPoints];
int[] aY = new int[mouse.maxPoints];
float m, c;
int corners;
//float triAng = 30;
float triAng = 255/(((mouse.maxPoints)*(mouse.maxPoints + 1))/2);
public void drawing( int xx, int yy, int Number ) {
aX[Number] = xx;
aY[Number] = yy;
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(new Color(0,255,0,255));
g.setColor(new Color(255,0,0,(int)triAng ));
for(int i=0; i<mouse.numPoints;i++){
for( int j = i+1; j < mouse.numPoints; j++)
{
// Shading the area
//1) finding the equation of the line
if( aX[i] != aX[j]){
if( aY[i] != aY[j]){
//Work out the Gradient
m = (float)(aY[j] - aY[i] ) /(aX[j] - aX[i]);
c = ((float)aY[i]-(((float)aX[i])*m));
for(int k=0;k<mouse.numPoints;k++){
if(m<0){
//Gradient is negative
if(k!= i && k!=j){
//Below
if( aX[k]*m+c < aY[k]){
//Clockwise from origin
// Left Right
// N - no additional corner
// Y- Additional Corner
// N N
if( ( c >= 400) && (500*m+c) >= 0) {
polX[1] = (int)((400-c)/m);
polY[1] = 400;
polX[2] = 500;
polY[2] = (int)(500*m+c);
corners = 3;
}
// N Y
else if( c >= 400 && (500*m+c) < 0) {
polX[1] = (int)((400-c)/m);
polY[1] = 400;
polX[2] = (int)((0-c)/m);
polY[2] = 0;
polX[3] = 500;
polY[3] = 0;
corners = 4;
}
// Y N
else if( c < 400 && (500*m+c) >= 0) {
polX[1] = 0;
polY[1] = 400;
polX[2] = 0;
polY[2] = (int)c;
polX[3] = 500;
polY[3] = (int)(500*m+c);
corners = 4;
}
// YY
else if( c < 400 && (500*m+c) < 0){
polX[1] = 0;
polY[1] = 400;
polX[2] = 0;
polY[2] = (int)c;
polX[3] = (int)((0-c)/m);
polY[3] = 0;
polX[4] = 500;
polY[4] = 0;
corners = 5;
}
//Origin corners
polX[0] = 500;
polY[0] = 400;
g.fillPolygon(polX, polY, corners);
}
//I am here
///////////////Above
if( aX[k]*m+c > aY[k]){
//Clockwise from origin
// Left Right
// N - no additional corner
// Y- Additional Corner
// N N
if( ( c <= 400) && (500*m+c) <= 0) {
polX[1] = (int)((0-c)/m);
polY[1] = 0;
polX[2] = 0;
polY[2] = (int)(c);
corners = 3;
}
// N Y
else if( c <= 400 && (500*m+c) > 0) {
polX[1] = 500;
polY[1] = 0;
polX[2] = 500;
polY[2] = (int)(500*m+c);
polX[3] = 0;
polY[3] = (int)c;
corners = 4;
}
// Y N
else if( c > 400 && (500*m+c) <= 0) {
polX[1] = (int)((0-c)/m);
polY[1] = 0;
polX[2] = (int)((400-c)/m);
polY[2] = 400;
polX[3] = 0;
polY[3] = 400;
corners = 4;
}
// Y Y
else if( c > 400 && (500*m+c) > 0){
polX[1] = 500;
polY[1] = 0;
polX[2] = 500;
polY[2] = (int)(500*m+c);
polX[3] = (int)((400-c)/m);
polY[3] = 400;
polX[4] = 0;
polY[4] = 400;
corners = 5;
}
//Origin corners
polX[0] = 0;
polY[0] = 0;
g.fillPolygon(polX, polY, corners);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
if(m>0){
//Gradient is Positive
if(k!= i && k!=j){
//Below
if( aX[k]*m+c < aY[k]){
//Clockwise from origin
// Left Right
// N - no additional corner
// Y- Additional Corner
// N N
if( ( c >= 0 ) && (500*m+c) >= 400) {
polX[1] = 0;
polY[1] = (int)c;
polX[2] = (int)((400-c)/m);
polY[2] = 400;
corners = 3;
}
// N Y
else if( c >= 0 && (500*m+c) < 400) {
polX[1] = 0;
polY[1] = (int)c;
polX[2] = 500;
polY[2] = (int)(500*m+c);
polX[3] = 500;
polY[3] = 400;
corners = 4;
}
// Y N
else if( c < 0 && (500*m+c) >= 400) {
polX[1] = 0;
polY[1] = 0;
polX[2] = (int)((0-c)/m);
polY[2] = 0;
polX[3] = (int)((400-c)/m);
polY[3] = 400;
corners = 4;
}
// Y Y
else if( c < 0 && (500*m+c) < 400){
polX[1] = 0;
polY[1] = 0;
polX[2] = (int)((0-c)/m);
polY[2] = 0;
polX[3] = 500;
polY[3] = (int)(500*m+c);
polX[4] = 500;
polY[4] = 400;
corners = 5;
}
//Origin corners
polX[0] = 0;
polY[0] = 400;
g.fillPolygon(polX, polY, corners);
}
///////////////Above
if( aX[k]*m+c > aY[k]){
//Clockwise from origin
// Left Right
// N - no additional corner
// Y- Additional Corner
// N N
if( ( c <= 0) && (500*m+c) <= 400) {
polX[1] = 500;
polY[1] = (int)(500*m+c);
polX[2] = (int)((0-c)/m);
polY[2] = 0;
corners = 3;
}
// N Y
else if( c <= 0 && (500*m+c) > 400) {
polX[1] = 500;
polY[1] = 400;
polX[2] = (int)((400-c)/m);
polY[2] = 400;
polX[3] = (int)((0-c)/m);
polY[3] = 0;
corners = 4;
}
// Y N
else if( c > 0 && (500*m+c) <= 400) {
polX[1] = 500;
polY[1] = (int)(500*m+c);
polX[2] = 0;
polY[2] = (int)c;
polX[3] = 0;
polY[3] = 0;
corners = 4;
}
// Y Y
else if( c > 0 && (500*m+c) > 40){
polX[1] = 500;
polY[1] = 400;
polX[2] = (int)((400-c)/m);
polY[2] = 400;
polX[3] = 0;
polY[3] = (int)c;
polX[4] = 0;
polY[4] = 0;
corners = 5;
}
//Origin corners
polX[0] = 500;
polY[0] = 0;
g.fillPolygon(polX, polY, corners);
}
}
}
}
}
else{
//code for horizontal line
}
}
else{
//Vertical
}
}
}
g.setColor(new Color(0,255,0,255));
for(int i=0; i<mouse.numPoints; i++){
g.fillOval(aX[i] - 10,aY[i]-10,20,20);
}
// Drawing The Line //////
for(int i=0; i<mouse.numPoints;i++){
for( int j = i+1; j < mouse.numPoints; j++){
g.setColor(new Color(0,255,0,255));
g.drawLine(aX[i], aY[i], aX[j], aY[j]);
g.setColor(new Color(255,0,0,(int)triAng));
}
}
}
}
it's pretty hard to tell the transparency of a pixel, because it doesn't have one once it's been drawn...
transparency only works, when you draw a pixel: you draw a certain color with a certain alpha on a certain background. the result, the pixel itself has no alpha any more once it has been drawn...
what you have:
what you have to do
for example: a red pixel (original 0xFF0000) is 0x7F0000 on a white (0xFFFFFF) background means you have a transparency of 0x7F (50%)
but here lacks my knowledge... you surely can make up your own calculations for transparency, i really hope so ^^
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With