日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 动态写轮眼 SharinganJPanel (整理)

發布時間:2024/9/20 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 动态写轮眼 SharinganJPanel (整理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 1 /** 2 * Java 動態寫輪眼 SharingganJPanel (整理) 3 * 4 * 2016-1-2 深圳 南山平山村 曾劍鋒 5 * 設計聲明: 6 * 1、雖然岸本是日本人,而我個人作為其模仿者,依然想表示個人對其的敬意,希望作品 7 * 不會玷污寫輪眼的名聲。 8 * 2、由于本次設計包含過多數學計算,所以強烈建議您通過《注意事項》中的5查看圖是 9 * 如何設計的,先不要看源碼,然后自己試圖去設計,而您僅需要知道:計算機計算 10 * 開方、三角函數、反三角等會造成誤差,僅此而已。 11 * 3、由于我本人在《動態中國太極圖——Java原創》中改了一個注釋錯誤,導致《動態中國 12 * 太極圖——Java原創》不能再次通過系統的審批,不知何故,所以導致大家可能看不 13 * 到《動態中國太極圖——Java原創》里面詳細的注釋,深表遺憾。同時也對我自己沒 14 * 能認真做好本質工作表示深深的反思。 15 * 4、如果您對這個很好奇,那么請現查閱本人發表的《動態中國太極圖——Java原創》(不 16 * 知道還能不能通過審批)、《動態眨眼效果——Java原創》,因為那兩個是這個設計 17 * 的引導+鋪墊。 18 * 19 * 20 * 注意事項: 21 * 1、本程序為java程序,同時感謝您花費寶貴的時間來閱讀本文檔; 22 * 2、請注意包名為:practice,文件名為:SharinganJFrame(Sharingan是寫輪眼的英文), 23 * 注意檢查,以防一些不必要的麻煩; 24 * 3、在完成確認2中的內容后,本程序可以直接運行,因為本軟件說明都在注釋中; 25 * 4、由于本設計是繼《動態中國太極圖——Java原創》、《動態眨眼效果——Java原創》后編 26 * 寫,所以在那里面已說明的東西,不再詳述,同時由于個人能力、閱歷等原因,有 27 * 些細節可能并沒有詳細闡述,或者有疏漏,請諒解。 28 * 5、您可以注釋paint()方法中的一些代碼,因為效果很直觀,也許這樣您理解得更快, 29 建議如下: 30 * 5.1 先看paint()方法第1條語句效果,把paint()方法中的其它語句注釋掉; 31 * 5.2 再看paint()方法第1、2條語句效果,把paint()方法中的其它語句注釋掉; 32 * 5.3 再看paint()方法第1、2、3條語句效果,把paint()方法中的其它語句注釋掉; 33 * 5.4 以上面的方法類推,直到paint()方法中沒有語句被注釋,相信等您看完,您就 34 * 理解了。 35 * 36 * 設計目標:在一個JFrame中繪制一個動態的寫輪眼(動漫《火影》中的特殊眼睛)。 37 * 38 * 設計說明: 39 * 相信很多人不喜歡看那些很長文字的說明,所以本人只簡單介紹一下個人想法及遇到的一 40 * 些問題: 41 * 1、設計的源頭來自我和同桌(程夢真)無意中提到寫輪眼,所以打算把它用Java繪出來, 42 * 而且要是動態的; 43 * 2、目前的版本的寫輪眼和最初設計的寫輪眼有很大差別,很多單詞的定義已經沒有了 44 * 當初的味道。 45 * 3、繪制這個動態的寫輪眼的時候遇到最嚴重的的問題是計算誤差,就是蒼老師說的 46 * 精確但不準確,所以angleErr是用來做誤差補償的,當然這個還是不是很準確,沒 47 * 有更深入的去探究,由于本來就是娛樂,所以沒打算去深究,如果你感興趣,想去 48 * 琢磨,請注意一下angleErr所出現的地方,本人因為這個誤差,重畫了進3遍才找 49 * 出根本原因。 50 * 51 * 2014-1-13 星期一 晴 8度 微風 南昌 52 * 53 */ 54 package demo; 55 56 import java.awt.Color; 57 import java.awt.Graphics; 58 59 import javax.swing.JFrame; 60 import javax.swing.JPanel; 61 62 public class SharinganJPanel extends JPanel { 63 //設置中心坐標,個人喜歡一種心點作為物體的坐標,物理里面成為質點 64 static int centerX = 600/2; 65 static int centerY = 600/2; 66 //外圓半徑,寫輪眼轉動所依賴的紅線 67 double extendCircleSemi = 25; // double extendCircleSemi = 200; 68 //寫輪眼的旋轉部分有一個固定的大小的圓,剛開始設計的時候是定義為白色的,后來改為了紅色,好看 ^_^ 69 double whiteOfSharingan = extendCircleSemi/3; // double whiteOfSharingan = extendCircleSemi/6; 70 //在上面的紅色的圓旁邊有一個隨著旋轉角度變大而變大的圓,其半徑為miniCircleSemi 71 double miniCircleSemi = 0; 72 //這里用到了繪制太極時的思路,這個圓和上面的兩個圓(whiteOfSharingan和miniCircleSemi)外切 73 double sharinganSemi = 0; 74 //旋轉度角范圍的變量,您可以通過觀察旋轉的循環角度是120*2 75 int angleCircle = 0; 76 //小圓(miniCircleSemi)和白圓(whiteOfSharingan)在外圓(extendCircleSemi)上的角度 77 double angleOfWhiteMini = 0; 78 //寫輪眼溝玉圓(sharinganSemi)和白圓(whiteOfSharingan)在外圓(extendCircleSemi)的角度 79 double angleOfwhiteShar = 0; 80 //用于判斷圓是否到達極限位置,還句話說就是是否到達了正確的角度,進行下一次循環 81 boolean flag = true; 82 //溝玉球心到弦(whiteOfSharingan圓中心和miniCircleSemi圓中心所連成的線)中心距離; 83 double distansOfWhiteShar =0; 84 //溝玉球心到中心點的距離,這一步主要是為了計算坐標 85 double distansOfSharSemi = 0; 86 //在繪圖過程中,由于計算機計算開方、三角函數、反三角等造成了誤差,這是一個補償值,但要注意真正補償的 87 //誤差為這個誤差的angleErr*2/3,因為這個值是本人通過理想設置臨界狀態得到的值。 88 double angleErr = 0.02500260489936114; 89 //溝玉球(whiteOfSharingan)中的黑球半徑,這個值是動態的 90 int blackOfWhiteSemi = 0; 91 //中心眼睛所占的長度 92 int eyeLength = 300; 93 //眼睛幅值 94 int amplitude = 50; 95 96 public SharinganJPanel() { 97 98 startRun(); 99 } 100 101 @Override 102 public void paint(Graphics graphics) { 103 System.out.println(); 104 super.paint(graphics); 105 this.setBackground(Color.black); 106 //繪制一個眼睛作為背景 107 graphics.setColor(Color.red); 108 for (int i = 0; i < eyeLength; i++) { 109 graphics.drawLine( centerX-eyeLength/2+i, 110 centerY-(int)(Math.sin(Math.PI*i/eyeLength)*amplitude), 111 centerX-eyeLength/2+i, 112 centerY+(int)(Math.sin(Math.PI*i/eyeLength)*amplitude)); 113 } 114 //在眼睛的中心繪制一個黑色的圓 115 graphics.setColor(Color.black); 116 graphics.fillOval( centerX-90/2, 117 centerY-90/2, 118 90, 119 90); 120 //在眼睛的中心繪制一個白色的圓 121 graphics.setColor(Color.white); 122 graphics.fillOval( centerX-60/2/2/2, 123 centerY-60/2/2/2, 124 60/2/2, 125 60/2/2); 126 //用于繪制3個不同角度、在不斷變化、不同位置的太極圖,圖是有順序的 127 for (int i = 0; i < 3; i++) { 128 //繪制寫輪眼球(sharinganSemi) 129 graphics.setColor(Color.red); 130 graphics.fillArc( (int)(centerX-sharinganSemi+Math.cos(Math.PI*(angleCircle+90+(i*120))/180-angleOfWhiteMini/2+angleOfwhiteShar+angleErr*2/3)*distansOfSharSemi), 131 (int)(centerY-sharinganSemi-Math.sin(Math.PI*(angleCircle+90+(i*120))/180-angleOfWhiteMini/2+angleOfwhiteShar+angleErr*2/3)*distansOfSharSemi), 132 (int)(sharinganSemi*2), 133 (int)(sharinganSemi*2),angleCircle+i*120,180); 134 //繪制寫輪眼固定圓(whiteOfSharingan) 135 graphics.setColor(Color.red); 136 graphics.fillOval( (int)(centerX-whiteOfSharingan+Math.cos(Math.PI*(angleCircle+90+(i*120))/180)*extendCircleSemi), 137 (int)(centerY-whiteOfSharingan-Math.sin(Math.PI*(angleCircle+90+(i*120))/180)*extendCircleSemi), 138 (int)(whiteOfSharingan*2), 139 (int)(whiteOfSharingan*2)); 140 //繪制寫輪眼黑球(miniCircleSemi) 141 graphics.setColor(Color.black); 142 graphics.fillOval( (int)(centerX-miniCircleSemi+Math.cos(Math.PI*(angleCircle+90+(i*120))/180-angleOfWhiteMini)*extendCircleSemi), 143 (int)(centerY-miniCircleSemi-Math.sin(Math.PI*(angleCircle+90+(i*120))/180-angleOfWhiteMini)*extendCircleSemi), 144 (int)(miniCircleSemi*2), 145 (int)(miniCircleSemi*2)); 146 //繪制寫輪眼固定球內黑球(blackOfWhiteSemi) 147 graphics.setColor(Color.black); 148 graphics.fillOval( (int)(centerX-(blackOfWhiteSemi+0.0)/120*whiteOfSharingan/2+Math.cos(Math.PI*(angleCircle+90+(i*120))/180)*extendCircleSemi), 149 (int)(centerY-(blackOfWhiteSemi+0.0)/120*whiteOfSharingan/2-Math.sin(Math.PI*(angleCircle+90+(i*120))/180)*extendCircleSemi), 150 (int)((blackOfWhiteSemi+0.0)/120*whiteOfSharingan), 151 (int)((blackOfWhiteSemi+0.0)/120*whiteOfSharingan)); 152 } 153 //繪制外圓 154 graphics.setColor(Color.red); 155 graphics.drawOval( (int)(centerX-extendCircleSemi), 156 (int)(centerY-extendCircleSemi), 157 (int)(extendCircleSemi)*2, 158 (int)(extendCircleSemi)*2); 159 } 160 public void startRun() { 161 new Thread(){ 162 public void run() { 163 while(true){ 164 if (flag) { 165 angleCircle += 2 ; 166 //溝玉白球中的黑球半徑 167 blackOfWhiteSemi = angleCircle; 168 //System.out.println(angleCircle); 169 //根據目前寫輪眼溝玉球轉過角度來確定mini小球目前的對應的半徑 170 miniCircleSemi = (angleCircle+0.0)/120*whiteOfSharingan; 171 //System.out.println(miniCircleSemi); 172 //溝玉球半徑 173 sharinganSemi = miniCircleSemi+whiteOfSharingan; 174 //System.out.println(sharinganSemi); 175 //由于白球和mini小球都是在外圓上,所以通過弦對應的角度來求的小圓落后于白球的角度 176 angleOfWhiteMini = Math.asin(sharinganSemi/2/extendCircleSemi)*2; 177 //System.out.println(angleOfWhiteMini); 178 //溝玉球心到白球中心距離 179 distansOfWhiteShar = (whiteOfSharingan-miniCircleSemi)/2; 180 //溝玉球心到中心點的距離 181 distansOfSharSemi = Math.sqrt( extendCircleSemi*extendCircleSemi 182 -((whiteOfSharingan+miniCircleSemi)/2)*((whiteOfSharingan+miniCircleSemi)/2) 183 +((whiteOfSharingan-miniCircleSemi)/2)*((whiteOfSharingan-miniCircleSemi)/2)); 184 //溝玉球心和白求在中心圓上所成的角度 185 //通過這里可以可以求出由于計算機計算產生的計算誤差為(0.02500260489936114) 186 //System.out.println(distansOfSharSemi); 187 angleOfwhiteShar = Math.asin(distansOfWhiteShar/2/distansOfSharSemi); 188 //System.out.println(angleOfwhiteShar); 189 if (angleCircle == 120) { 190 flag = false; 191 } 192 }else { 193 angleCircle += 2; 194 //溝玉白球中的黑球半徑 195 blackOfWhiteSemi = 240-angleCircle; 196 //根據目前寫輪眼溝玉球轉過角度來確定mini小球目前的對應的半徑 197 miniCircleSemi = (240.0-angleCircle)/120*whiteOfSharingan; 198 //miniCircleSemi = (angleCircle+0.0)/120*whiteOfSharingan; 199 //溝玉球半徑 200 sharinganSemi = miniCircleSemi+whiteOfSharingan; 201 //由于白球和mini小球都是在外圓上,所以通過弦對應的角度來求的小圓落后于白球的角度 202 angleOfWhiteMini = Math.asin(sharinganSemi/2/extendCircleSemi)*2; 203 //溝玉球心到白球中心距離 204 distansOfWhiteShar = (whiteOfSharingan-miniCircleSemi)/2; 205 //溝玉球心到中心點的距離 206 distansOfSharSemi = Math.sqrt( extendCircleSemi*extendCircleSemi 207 -((whiteOfSharingan+miniCircleSemi)/2)*((whiteOfSharingan+miniCircleSemi)/2) 208 +((whiteOfSharingan-miniCircleSemi)/2)*((whiteOfSharingan-miniCircleSemi)/2)); 209 //溝玉球心和白求在中心圓上所成的角度 210 angleOfwhiteShar = Math.asin(distansOfWhiteShar/2/distansOfSharSemi); 211 if (angleCircle == 240) { 212 angleCircle = 0; 213 flag = true; 214 } 215 } 216 try { 217 Thread.sleep(20); 218 } catch (InterruptedException e) { 219 e.printStackTrace(); 220 } 221 repaint(); 222 } 223 }; 224 }.start(); 225 } 226 public static void main(String[] args) { 227 JFrame jFrame = new JFrame(); 228 jFrame.setTitle("Sharingan"); 229 jFrame.setSize(centerX*2, centerY*2); 230 jFrame.getContentPane().setBackground(Color.black); 231 jFrame.setLocationRelativeTo(null); 232 jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 233 234 JPanel jPanel = new SharinganJPanel(); 235 jFrame.add(jPanel); 236 jFrame.setVisible(true); 237 } 238 }

?

?

效果如圖:

  

  

  

  

轉載于:https://www.cnblogs.com/zengjfgit/p/5094878.html

總結

以上是生活随笔為你收集整理的Java 动态写轮眼 SharinganJPanel (整理)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。