到現(xiàn)在我對多線程的理解就是,能夠同時讓多個任務同時執(zhí)行----this is right
鎮(zhèn)賚ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
但是僅僅對一個對象的話能否讓一個對象同時做多個事情呢? -----不可以
你記得書上講多線程提到的一個概念叫做鎖。synchronized.
一個對象只有一把鎖 當然這個對象只能對打開他鎖的人敞開心扉。
你明白了嗎。
import?javax.swing.*;
import?java.awt.*;
import?java.awt.event.ActionEvent;
import?java.awt.geom.*;
/**
*?@author?Hardneedl
*/
class?RectTransform?extends?JFrame?{
private?static?final?Dimension?minSize?=?new?Dimension(300,?200);
private?static?final?Dimension?maxSize?=?new?Dimension(1024,?768);
private?static?final?Dimension?preferredSize?=?new?Dimension(600,?400);
public?Dimension?getMaximumSize()?{return?maxSize;}
public?Dimension?getMinimumSize()?{return?minSize;}
public?Dimension?getPreferredSize()?{return?preferredSize;}
public?String?getTitle()?{return?"Frame?Title";}
private?AffineTransform?af?=?new?AffineTransform();
private?Stroke?stroke?=?new?BasicStroke(2.0f);
private?Rectangle?rct?=?new?Rectangle(40,140,200,140);
private?JComponent?canvas?=?new?JComponent(){
protected?void?paintComponent(Graphics?g)?{
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0,0,getWidth(),getHeight());
Graphics2D?g2d?=?(Graphics2D)g.create();
g2d.setColor(Color.YELLOW);
g2d.setTransform(af);
g2d.setStroke(stroke);
g2d.draw(rct);
g2d.dispose();
}
};
RectTransform()?throws?HeadlessException?{
init();
doLay();
attachListeners();
}
private?void?init()?{
}
private?void?doLay()?{
Container?container?=?getContentPane();
JPanel?panel?=?new?JPanel(new?FlowLayout(FlowLayout.CENTER,30,5));
panel.add(new?JButton(?new?AfAction("move",?AffineTransform.getTranslateInstance(100,100))?));
panel.add(new?JButton(?new?AfAction("rotate",?AffineTransform.getRotateInstance(Math.PI/3,40,120)?)?));
panel.add(new?JButton(?new?AfAction("zoomIn",?AffineTransform.getScaleInstance(2,2))?));
panel.add(new?JButton(?new?AfAction("ZoomOut",?AffineTransform.getScaleInstance(.5d,.5d))?));
panel.add(new?JButton(?new?AfAction("Original",?new?AffineTransform())?)?);
container.add(panel,BorderLayout.NORTH);
container.add(canvas,BorderLayout.CENTER);
pack();
}
private?void?attachListeners()?{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private?class?AfAction?extends?AbstractAction?{
private?AffineTransform?aff;
private?AfAction(String?n,AffineTransform?af)?{
super(n);
this.aff?=?af;
}
public?void?actionPerformed(ActionEvent?e)?{
af.setTransform(aff);
if(canvas.isVisible())?canvas.paintImmediately(0,0,getWidth(),getHeight());
}
}
public?static?void?main(String[]?args)?{
new?RectTransform().setVisible(true);
}
}
重載渲染控件的paintComponent(Graphics
g)方法.
設你當前圖像實例為img,已初始化,需要旋轉(zhuǎn)的角度為ang
public
void
paintComponent(Graphics
g){
super.paintCompoent(g);
Graphics2D
g2d
=
(Graphics2D)g;
g2d.rotate(-angle);
g2d.drawImage(img,0,0,this.getWidth(),this.getHeight(),null);
}
Graphics,Graphics2D
類中有對當前描繪環(huán)境進行仿射變換的方法,包括translate,scale,rotate,也可以直接設置仿射變換矩陣,利用這點就可以根據(jù)所需要的實現(xiàn)方式來進行描繪.
java編寫二維坐標平移程序,主要是通過類繼承Point2D,使用里面的方法來平移,如下代碼:
class??Point2D
{???
int?x,?y;
Point2D(){??}
Point2D(int?i,int?j)
{
x=i;
y=j;
}
void?offset(int?a,?int?b)
{
x=x+a;
y=y+b;
}
void?distance(Point2D?a,Point2D?b)?
{
float?m;
m=(float)Math.sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
System.out.print("二維空間兩點之間的距離:");
System.out.println("m="+m);
}
}
public?class?Point3D?extends?Point2D
{
int?x,y,z;
Point3D(int?x,int?y,int?z)
{
this.x=x;
this.y=y;
this.z=z;
}
Point3D(Point2D?p,int?z)
{
x=p.x;
y=p.y;
this.z=z;
}
void?offset(int?a,?int?b,int?c)
{
x=x+a;
b=x+b;
c=x+c;
}?
void?distance(Point3D?a,Point3D?b)?
{
float?n;
n=(float)Math.sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.y-b.y)*(a.y-b.y));//計算兩點之間的距離。
System.out.print("三維空間兩點之間的距離:");
System.out.println("n="+n);
}
public?static?void?main(String[]?args)?
{
Point2D?p2d1=new?Point2D(2,3);
Point2D?p2d2=new?Point2D(3,6);
Point3D?p2d3=new?Point3D(1,2,3);
Point3D?p2d4=new?Point3D(p2d1,3);
p2d1.distance(p2d1,p2d2);
p2d3.distance(p2d3,p2d4);//平移一段距離。
}
}
(注,下面的(x,y)就是你的圖片所有的點圍繞旋轉(zhuǎn)的中心,為(0,0)即為繞原點進行旋轉(zhuǎn)
當然是用矩陣啦,左乘一個三階矩陣
(cosA, -sinA, x,sinA, cosA, y,0, 0 , s)
其中a代表你要旋轉(zhuǎn)的角度 ;旋轉(zhuǎn)變幻(繞原點,繞其他點直接平移即可)即為 X’ = X * cosA - Y * sinA; Y' = X * sinA + Y * cosA;
可以用極坐標輕松證明之,建議你自己推導一遍,,,,,,
(x,y)代表平移的坐標,不平移就為0, s代表縮放的倍數(shù),,不縮放為1;
如果不會用矩陣或者不想用的話就直接用上面那個給出的公式進行變幻,,,,,,
還是用矩陣吧,,方便一點。。。。
在操作二維或三維的圖形圖像上,長期以來人們總結出了一些常用的變換矩陣,這些矩陣就像公式和定理一樣被開發(fā)人員使用,樓主可以把這些矩陣當成公式來記憶,就像我們小時候背加法、乘法口訣一樣。
如果樓主想了解得更深入一些,請往下看:
[?x']???[??m00??m01??m02??]?[?x?]???[?m00x?+?m01y?+?m02?]
[?y']?=?[??m10??m11??m12??]?[?y?]?=?[?m10x?+?m11y?+?m12?]
[?1?]???[???0????0????1???]?[?1?]???[?????????1?????????]
上面的式子是jdk文檔中復制過來的,就是變換時的運算過程,也就是說變換后的坐標x'、y'是由一個3*3的矩陣與原坐標x、y相乘得出的,其中的m00~m12就是AffineTransform構造方法中的六個參數(shù),另外,式子中的最后一行是固定的。
矩陣乘法就不用說了吧,最后得出的結果就是上式中的最后一列,可能寫成下面這樣會更容易理解:
x'?=?m00x?+?m01y?+?m02
y'?=?m10x?+?m11y?+?m12
看出什么了嗎?其實這就是二維平面直角坐標系中的兩個很簡單的二元一次方程而已,方程定義的就是橫縱坐標變換的規(guī)則。
以水平翻轉(zhuǎn)為例,水平翻轉(zhuǎn)是以圖形/圖像的垂直中線為軸來翻轉(zhuǎn)的,因此任何一個點(x,y)變換后的坐標應該是y坐標不變,x坐標變?yōu)?x+width-1,即(-x+width-1,y),之所以減1是因為垂直中軸上的點不應該改變。
理解了上面的變換過程之后,將結果帶入上面的兩個二元一次方程,可以得出
m00=-1、m01=0、m02=width-1
m10=0、m11=1、m12=0
正好是你給的代碼中的六個值(AffineTransform構造方法中的參數(shù)順序為m00、m10、m01、m11、m02、m12)
其他幾個變換道理是一樣的
網(wǎng)站標題:java圖像平移代碼 圖像的平移
當前路徑:http://jinyejixie.com/article42/hpchec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、App開發(fā)、Google、建站公司、App設計、服務器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)