一段纹理的代码,是自己推的肯定不怎么好
可以把float替换为定点数,把image改为一段int 数据
可以把float替换为定点数,把image改为一段int 数据
public
void
textureTest(
float
x1,
float
y1,
float x2, float y2,
float x3, float y3,
float u1, float v1,
float u2, float v2,
float u3, float v3,
Image texture
) {
float dxab,dyab,dxbc,dybc,dxca,dyca;
float duab,dvab,dubc,dvbc,duca,dvca;
dxab=x2-x1;
dyab=y2-y1;
dxbc=x3-x2;
dybc=y3-y2;
dxca=x1-x3;
dyca=y1-y3;
duab=u2-u1;
dvab=v2-v1;
dubc=u3-u2;
dvbc=v3-v2;
duca=u1-u3;
dvca=v1-v3;
float dyu, dyv, dxu, dxv;
dyu=(duab*dxbc-dubc*dxab)/(dyab*dxbc-dybc*dxab);
dyv=(dvab*dxbc-dvbc*dxab)/(dyab*dxbc-dybc*dxab);
dxu=(duab-dyu*dyab)/dxab;
dxv=(dvab-dyv*dyab)/dxab;
System.out.println("textuetest, dxu="+dxu);
System.out.println("textuetest, dxv="+dxv);
int []textureData=new int[texture.getHeight()*texture.getWidth()];
texture.getRGB(textureData,0,texture.getWidth(),0,0,texture.getWidth(),texture.getHeight());
int textureWidth=texture.getWidth();
int textureHeight=texture.getHeight();
System.out.println("textuetest vpx="+vpx+" vpy="+vpy);
for(int y=0;y<320/*canvas height*/;y++){
for(int x=0;x<240/*canvas width*/;x++){
float u,v;
u=(x-x1)*dxu +(y-y1)*dyu + u1;
v=(x-x1)*dxv +(y-y1)*dyv + v1;
u=textureTestBetween0to1(u);
v=textureTestBetween0to1(v);
u*=textureWidth;
v*=textureHeight;
int ui=(int )u;
int vi=(int )v;
if(ui==textureWidth){
ui=0;
}
if(vi==textureHeight){
vi=0;
}
// System.out.println("ui="+ui +" vi="+vi);
int color=textureData[ui+vi*textureWidth];
g.setColor((color&0x00ffffff));
g.drawLine(x,y,x,y);
}
}
g.setColor(0xffffff);
g.drawLine((int )x1,(int )y1,(int )x2,(int )y2);
g.drawLine((int )x3,(int )y3,(int )x2,(int )y2);
g.drawLine((int )x3,(int )y3,(int )x1,(int )y1);
}
public float textureTestBetween0to1( float u) {
if(u<0){
u=u-((int)u)+1;
}else if(u>=1){
u=u-((int)u);
}
return u;
}
float x2, float y2,
float x3, float y3,
float u1, float v1,
float u2, float v2,
float u3, float v3,
Image texture
) {
float dxab,dyab,dxbc,dybc,dxca,dyca;
float duab,dvab,dubc,dvbc,duca,dvca;
dxab=x2-x1;
dyab=y2-y1;
dxbc=x3-x2;
dybc=y3-y2;
dxca=x1-x3;
dyca=y1-y3;
duab=u2-u1;
dvab=v2-v1;
dubc=u3-u2;
dvbc=v3-v2;
duca=u1-u3;
dvca=v1-v3;
float dyu, dyv, dxu, dxv;
dyu=(duab*dxbc-dubc*dxab)/(dyab*dxbc-dybc*dxab);
dyv=(dvab*dxbc-dvbc*dxab)/(dyab*dxbc-dybc*dxab);
dxu=(duab-dyu*dyab)/dxab;
dxv=(dvab-dyv*dyab)/dxab;
System.out.println("textuetest, dxu="+dxu);
System.out.println("textuetest, dxv="+dxv);
int []textureData=new int[texture.getHeight()*texture.getWidth()];
texture.getRGB(textureData,0,texture.getWidth(),0,0,texture.getWidth(),texture.getHeight());
int textureWidth=texture.getWidth();
int textureHeight=texture.getHeight();
System.out.println("textuetest vpx="+vpx+" vpy="+vpy);
for(int y=0;y<320/*canvas height*/;y++){
for(int x=0;x<240/*canvas width*/;x++){
float u,v;
u=(x-x1)*dxu +(y-y1)*dyu + u1;
v=(x-x1)*dxv +(y-y1)*dyv + v1;
u=textureTestBetween0to1(u);
v=textureTestBetween0to1(v);
u*=textureWidth;
v*=textureHeight;
int ui=(int )u;
int vi=(int )v;
if(ui==textureWidth){
ui=0;
}
if(vi==textureHeight){
vi=0;
}
// System.out.println("ui="+ui +" vi="+vi);
int color=textureData[ui+vi*textureWidth];
g.setColor((color&0x00ffffff));
g.drawLine(x,y,x,y);
}
}
g.setColor(0xffffff);
g.drawLine((int )x1,(int )y1,(int )x2,(int )y2);
g.drawLine((int )x3,(int )y3,(int )x2,(int )y2);
g.drawLine((int )x3,(int )y3,(int )x1,(int )y1);
}
public float textureTestBetween0to1( float u) {
if(u<0){
u=u-((int)u)+1;
}else if(u>=1){
u=u-((int)u);
}
return u;
}