Solved

Moving a pixel along a vector!

Posted on 2003-12-02
8
286 Views
Last Modified: 2010-03-31
Save Me!

The following function is -supposed- to move a pixel along a vector from the current point to the origin a little way.

Variables and array's and all that are fine, what the problem is, is the -equation- for moving the point.

What's supposed to happen is:

A point's X and Y distances from the origin are found, then the distance of the point directly from the origin  is calculated using SQRT( DX*DX + DY*DY),

The X length and Y length are then reduced to single units by dividing DX and DY by the distance between the origin and the pixel.

Then the new distance is calulated by adding a small amount (can be negative) to the current distance.

Then the X and Y unit values are multiplied by the new distance value to find the co-ordinates of the translated pixel to be used instead of the pixel found at that point.

It should work, but the effect the following code generates produces is to move a pixel that should only move on the X direction (as the x pixel is in aline with the x origin) a little on the Y position too.

What on earth is going on? why does the pixel on the X origin's plane move on the Y too, and why does the same happen for Y?

It -must- be the equation, but I can't see what the problem is!

HELP!




  void generateBumpAndBaseImage()
    {
    int currentPixel=0;
    int dx=-((windowX/2)+centerX),dy=-((windowY/2)+centerY),rx=0,ry=0,mainPixel,dry,targetX=0,targetY=0,tempX,tempY,distX,distY;
    float sx,sy,smy,scaler,distance,xVector,yVector,newDistance;
    consta+=3;
    for(int y=dy;y<dy+windowY;targetY++,y++)
      {

      //**lighting**
      sy=y/40f;
      smy=(sy*sy)+consta;

      //**texture**
      distY=(targetY-centerY);
      dry=distY*distY;
      targetX=0;

      for(int x=dx;x<dx+windowX;targetX++,x++)
        {
        //**lighting**
        sx=x/40f;
        logo.imageA[currentPixel]=(int)(((Math.sin(((sx*sx)+consta)+smy)*128)+128)/depth);

        //**texture**
        distX=(targetX-centerX);

        //Find the distance current pixel is away from origin
        distance=(float)(Math.sqrt((distX*distX)+dry));

        //Find the unit x and y values of the pixel from the origin
        xVector=distX/distance;
        yVector=distY/distance;

        //Create new distance using bumpmap information as the alteration
        newDistance=distance+(float)((logo.imageA[currentPixel]-128f)/10f);

        //Move from the origin to the offset pixel
        tempX=(int)(xVector*newDistance)+centerX;
        tempY=(int)(yVector*newDistance)+centerY;

        //Check the new pixel is in bounds
        if(tempX<0) tempX=0;
        if(tempX>windowX) tempX=windowX;
        if(tempY<0) tempY=0;
        if(tempY>windowY-2) tempY=windowY-2;

        //Map the X,Y co-ordinates onto the array
        mainPixel=tempX+(tempY*windowX);

        //Store translated pixel in the image array
        logo.imageR[currentPixel]=baseTexture.imageR[mainPixel];
        logo.imageG[currentPixel]=baseTexture.imageG[mainPixel];
        logo.imageB[currentPixel]=baseTexture.imageB[mainPixel];

        currentPixel++;
        }
      }
    }



site: http://www.untamed.co.uk
0
Comment
Question by:Lab_Rat
8 Comments
 
LVL 3

Expert Comment

by:monkesdb
ID: 9864627
try this and see what happens.


 void generateBumpAndBaseImage()
    {
    int currentPixel=0;
    int dx=-((windowX/2)+centerX),dy=-((windowY/2)+centerY),rx=0,ry=0,mainPixel,dry,tempX,tempY,distX,distY;
    float sx,sy,smy,scaler,distance,xVector,yVector,newDistance;
    consta+=3;
    for(int y=dy;y<dy+windowY;y++)
      {

      //**lighting**
      sy=y/40f;
      smy=(sy*sy)+consta;

      dry=y*y;

      for(int x=dx;x<dx+windowX;x++)
        {
        //**lighting**
        sx=x/40f;
        logo.imageA[currentPixel]=(int)(((Math.sin(((sx*sx)+consta)+smy)*128)+128)/depth);


        //Find the distance current pixel is away from origin
        distance=(float)(Math.sqrt((x*x)+dry));

        //Find the unit x and y values of the pixel from the origin
        xVector=x/distance;
        yVector=y/distance;

        //Create new distance using bumpmap information as the alteration
        newDistance=distance+(float)((logo.imageA[currentPixel]-128f)/10f);

        //Move from the origin to the offset pixel
        tempX=(int)(xVector*newDistance)+centerX;
        tempY=(int)(yVector*newDistance)+centerY;

        //Check the new pixel is in bounds
        if(tempX<0) tempX=0;
        if(tempX>windowX) tempX=windowX;
        if(tempY<0) tempY=0;
        if(tempY>windowY-2) tempY=windowY-2;

        //Map the X,Y co-ordinates onto the array
        mainPixel=tempX+(tempY*windowX);

        //Store translated pixel in the image array
        logo.imageR[currentPixel]=baseTexture.imageR[mainPixel];
        logo.imageG[currentPixel]=baseTexture.imageG[mainPixel];
        logo.imageB[currentPixel]=baseTexture.imageB[mainPixel];

        currentPixel++;
        }
      }
    }
0
 
LVL 1

Author Comment

by:Lab_Rat
ID: 9868048
: thinks :
Hmmmmmmmm...... interesting!

I'm in work right now, but as soon as I've got home and been the loo, I'll cut & paste.

If you're reading this in the mean time, can I draw your attention to the current way it looks at:

Http://surf.to/labratspage

It's not the live version, just somewhere I can upload applets too without using my domains... hence all the JS errors because fortuncities code conflicts with mine. :o)

But it shows the effect I'm getting (The pixels move topy-left to bottomy-right, rather than uppy-downy and lefty-righty along the origin planes), I'll upload the latest change's you have proposed, and if it doesn't work, I'll send you the full .Java files if you want to look at them, so you can compile them and see what's going on properly.
:o)

I hope you come back! I'll keep monitoring this thread and am ready with the 250 points.
0
 
LVL 1

Author Comment

by:Lab_Rat
ID: 9871313
I found it by random alterations.
Erm, it was all to do with relative positions of things... I needed to actually change dx and xy's values, all the vector calculations were actually accurate!

Er.... I'm not sure how much work you did on your answer, would you mind taking just a few points as you didn't quite get it?

 void generateBumpAndBaseImage()
    {
    int currentPixel=0;
    int dx=-((windowX/2)+centerX-(windowX/2)),dy=-((windowY/2)+centerY-(windowY/2)),rx=0,ry=0,mainPixel,dry,targetX=0,targetY=0,tempX,tempY,distX,distY;
    float sx,sy,smy,scaler,distance,xVector,yVector,newDistance;
    consta+=3;
    for(int y=dy;y<dy+windowY;targetY++,y++)
      {

      //**lighting**
      sy=y/40f;
      smy=(sy*sy)+consta;

      //**texture**
      distY=(targetY-centerY);
      dry=distY*distY;
      targetX=0;

      for(int x=dx;x<dx+windowX;targetX++,x++)
        {
        //**lighting**
        sx=x/40f;
        logo.imageA[currentPixel]=(int)(((Math.sin(((sx*sx)+consta)+smy)*128)+128)/depth);

        //**texture**
        distX=(targetX-centerX);

        //Find the distance current pixel is away from origin
        distance=(float)(Math.sqrt((distX*distX)+dry));

        //Find the direction of the pixel from the origin
        xVector=distX/distance;
        yVector=distY/distance;

        //Create new distance using bumpmap information as the alteration
        newDistance=distance+(float)(Math.abs(logo.imageA[currentPixel]-128f)/10f);

        //Move from the origin to the offset pixel
        tempX=(int)(xVector*newDistance)+centerX;
        tempY=(int)(yVector*newDistance)+centerY;

        //Check the new pixel is in bounds
        if(tempX<0) tempX=0;
        if(tempX>windowX) tempX=windowX;
        if(tempY<0) tempY=0;
        if(tempY>windowY-2) tempY=windowY-2;

        //Map the X,Y co-ordinates onto the array
        mainPixel=tempX+(tempY*windowX);

        //Store translated pixel in the image array
        logo.imageR[currentPixel]=baseTexture.imageR[mainPixel];
        logo.imageG[currentPixel]=baseTexture.imageG[mainPixel];
        logo.imageB[currentPixel]=baseTexture.imageB[mainPixel];

        currentPixel++;
        }
      }
    }
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 15

Expert Comment

by:jimmack
ID: 9873063
If you've fixed it yourself, please post a free (0 point) question in the CS topic area asking to have the question PAQ'd (moved into the previously asked questions) and your points refunded.
0
 
LVL 3

Expert Comment

by:monkesdb
ID: 9878795
ahh i see where i went wrong, no matter.

and the applet crashed
0
 
LVL 1

Author Comment

by:Lab_Rat
ID: 9903352
Ok, I sure will when I get a spare few minutes.

The finished applet is <a href=http://www.untamed.co.uk/Site/Diary/Downloads/bigThing/bumpMapping.htm>-HERE-</a>

I'll award 50 points, 'cos I want to thank you for helping me out.

Cheers. :o)

 (would you mind explaining in english what happened? I fixed it by a drunken guess at 2 in the morning...)
0
 
LVL 1

Accepted Solution

by:
DarthMod earned 0 total points
ID: 11688320
Submitted to PAQ with points refunded (250)

DarthMod
Community Support Moderator
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
eclipse package explorer vs project explorer view 2 84
thymeleaf natural templating vs JSP 2 68
custom annotations 9 32
oracle 11g 23 50
INTRODUCTION Working with files is a moderately common task in Java.  For most projects hard coding the file names, using parameters in configuration files, or using command-line arguments is sufficient.   However, when your application has vi…
Java Flight Recorder and Java Mission Control together create a complete tool chain to continuously collect low level and detailed runtime information enabling after-the-fact incident analysis. Java Flight Recorder is a profiling and event collectio…
Viewers learn about the “for” loop and how it works in Java. By comparing it to the while loop learned before, viewers can make the transition easily. You will learn about the formatting of the for loop as we write a program that prints even numbers…
Viewers learn about the scanner class in this video and are introduced to receiving user input for their programs. Additionally, objects, conditional statements, and loops are used to help reinforce the concepts. Introduce Scanner class: Importing…

896 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now