努力,成長(zhǎng),提高

          在追求中進(jìn)步
          數(shù)據(jù)加載中……

          2009年2月11日

          html5 基于canvas的基礎(chǔ)類設(shè)計(jì)

          先給大家看一個(gè)demo
          http://www.koooi.com/html5/
          代碼很簡(jiǎn)單
          頁面上面加一個(gè)<canvas style="border:1px solid" id="canvas" width="1000" height="800">
                      <p>
                          Your browser does not support the canvas element.
                      </p>
                  </canvas>
          然后javascript中寫上

          var canvas = null;
          var ctx = null;
          var score = 0;
          var num = 51;
          function getRandomInt(a, b){
              
          return Math.floor(Math.random() * (b - a + 1)) + a;
              
          }

          window.onload 
          = init;

          function init(){
              canvas 
          = document.getElementById('canvas');
              scoreID 
          = document.getElementById('score');
              ctx 
          = canvas.getContext('2d');
              
          //    setInterval(draw, 1000 / FPS);
              
              controller 
          = new ERIC.CanvasController(ctx, canvas.width, canvas.height);
              controller.animateStopBySignal();
              canvas.onclick 
          = function(e){
                  
          var mousex = e.clientX;
                  
          var mousey = e.clientY;
                  
          var relativex = mousex - canvas.offsetLeft;
                  
          var relativey = mousey - canvas.offsetTop;
                  
          var len = controller.canvasObjectList.length;
                  
          var infig = false;
                  
          for (i = len - 1; i >= 0; i--) {
                      
          if (controller.canvasObjectList[i].isInFigure(relativex, relativey)) {
                          score 
          = score + 10;
                          infig 
          = true;
                          controller.canvasObjectList[i].removeFromControl();
                      }
                  }
                  
          if (!infig) {
                      score 
          = score - 10;
                  }
                  scoreID.innerHTML 
          = score;
              }
              
              ERIC.run(
          function test(){
                  
          var t = getRandomInt(00);
                  
          if (t == 0) {
                      num
          --;
                      
          if(num==0){
                          ERIC.stop();
                          
          return;
                      }
                      
          var cir1 = new ERIC.Circle(getRandomInt(70930), getRandomInt(70730), 5);
                      cir1.setTriggerDelete(
          function(){
                          
          return this.radius >= 40;
                      });
                      cir1.setAction(
          function(){
                          
          this.radius = this.radius + 1;
                      });
                      controller.add(cir1);
                  }
              }, 
          400);
          }

          很簡(jiǎn)單的代碼,利用了我寫的基礎(chǔ)類ERIC.Circle Eric.CanvasController 以及ERIC.Run
          使用簡(jiǎn)介:
          1.先實(shí)例化ERIC.
          CanvasController,假設(shè)實(shí)例名字controller
          2.實(shí)例化一個(gè)ERIC.BasicFigure類的子類的對(duì)象,現(xiàn)在EricUtils.js只提供了一個(gè)擴(kuò)展類Circle,假設(shè)實(shí)例名字為cir
          3.設(shè)置cir實(shí)例的動(dòng)作和刪除的條件。動(dòng)作意思是每一個(gè)動(dòng)畫要執(zhí)行什么操作,比如圓的半徑加1, 或者圓心移動(dòng)。刪除的條件比如半徑大于50就從畫布當(dāng)中刪除掉,不再顯示這個(gè)圓。
          cir1.setTriggerDelete(function(){
                          return this.radius >= 40;
                      });
                      cir1.setAction(function(){
                          this.radius = this.radius + 1;
                      });
          4.把cir添加到controller中。controller.add(cir)
          5.調(diào)用controller.animate(); 此方法會(huì)以每秒30幀來畫出cir對(duì)象,每幀結(jié)束執(zhí)行cir在第三步設(shè)置的動(dòng)作。到達(dá)刪除條件會(huì)刪除掉該object,直到?jīng)]有object在controller當(dāng)中。
          6.也可以調(diào)用controller.animateStopBySignal()方法,動(dòng)作和5相同,但是會(huì)一直進(jìn)行渲染,這樣適合于臨時(shí)添加object到controller當(dāng)中,添加進(jìn)去以后馬上就可以被渲染,直到滿足被刪除的條件。渲染結(jié)束需要調(diào)用controller.signalStop()

          基礎(chǔ)類下載地址http://www.koooi.com/html5/js/EricUtils.js
          當(dāng)然,這只是一個(gè)框架,以后要添加更多的功能,如果您對(duì)于html5有興趣,打算和我一起來開發(fā),歡迎聯(lián)系我
          希望可以起到拋磚引玉的作用。
          QQ627四23四四三

          posted @ 2010-06-13 02:07 孔陽 閱讀(1939) | 評(píng)論 (0)編輯 收藏
          用JAVA實(shí)現(xiàn)AI

               摘要: 從小就有一個(gè)夢(mèng)想,將來開發(fā)機(jī)器人,說白了,就是人工智能。現(xiàn)在看來,可喜的是,做的是軟件這行,還有點(diǎn)可行性,可惜的是,做的工作與人工智能不搭嘎,工作又太累,天天加班不說,大老遠(yuǎn)跑回家,就沒那么多時(shí)間去思考,學(xué)習(xí)人工智能了。徘徊猶豫了幾個(gè)月,一直沒有決心去寫代碼,這不,終于決定繼續(xù)小時(shí)候的夢(mèng)想,開始了用java實(shí)現(xiàn)人工智能的第一步了,那就是用java來分析語義,讓我們從頭開始。 我的第一個(gè)Miles...  閱讀全文

          posted @ 2010-06-06 23:59 孔陽 閱讀(7883) | 評(píng)論 (5)編輯 收藏
          用動(dòng)態(tài)規(guī)劃算法對(duì)最大子串問題的java實(shí)現(xiàn)

          最大字串問題描述大概就是給定2個(gè)字符串,找出他們兩個(gè)共有的最長(zhǎng)字符串。比如一個(gè)是"tabcfg"另外一個(gè)"abckj"那么最大子串就是"abc".
          動(dòng)態(tài)規(guī)劃算法最重要的就是分解問題,找出遞歸。說一下我的思考思路,首先拿到2個(gè)字符串,如何找到最長(zhǎng)子串呢?
          1.假設(shè)他們(字符串a(chǎn),b)的頭字母不相同的話,那么分別去掉首字母比較,也就是說用a.subString(1)和b比較,用b.subString(1)和a比較,最長(zhǎng)子字符串沒變吧?答案是肯定的。ok遞歸出現(xiàn)了,結(jié)束條件就是有一個(gè)字符串變空,返回值就是a和b的最長(zhǎng)子串。
          b.假設(shè)他們頭字母相同,那么一直比較下去,知道兩者的第n個(gè)字母不相同,然后把前n-1個(gè)字母存為子字符串c,把a(bǔ).subString(1)和b返回結(jié)果記為d,b.subString(1)和a返回結(jié)果記為e,那么返回c,d和e最長(zhǎng)的一個(gè)(感謝lexy的評(píng)論,之前確實(shí)遺漏一種情況。不應(yīng)該直接把前面的相同的去掉直接比較的,現(xiàn)在代碼已經(jīng)更新了)。
          也許有人說應(yīng)該從后面往前面比較,找到相同的然后一個(gè)個(gè)再往前比,其實(shí)道理都是一樣的,關(guān)鍵要找到分解問題的方法。這里只是拋磚引玉,下面是具體的java實(shí)現(xiàn)。

          import java.util.HashMap;
          import java.util.Map;
           
          /**
          @author HEACK
          *
          */
          public class CompareStr {
           
                  
          /**
                  * 
          @param args
                  
          */
                  
          public static void main(String[] args) {
                          
          // TODO Auto-generated method stub
                          String str1 = "abcde1234567abcdefghijk";
                          String str2 
          = "abcdefgh12345";
                         
                          
          //String str2 = "abc happyies dutcbirthday peter";
                          CompareStr cj = new CompareStr();
                          System.out.println(cj.getLongestString(str1,str2));
           
                  }
           
                  
          private boolean isEmpty(String str) {
                          
          return str == null || str.trim().length() == 0;
                  }
                  
          private Map map = new HashMap();
           
                  
          private String getLongestString(String str1, String str2) {
                          
          if (isEmpty(str1) || isEmpty(str2)) {
                                  
          return "";
                          }
                          StringBuffer key 
          = new StringBuffer();
                          key.append(str1).append(
          "&&").append(str2);
                          
          if (map.containsKey(key.toString())) {
                                  
          return (String)map.get(key.toString());
                          }
                          StringBuffer longestStr 
          = new StringBuffer();
                          
          char[] str1List = str1.toCharArray();
                          
          char[] str2List = str2.toCharArray();
                          
          int i = 0;
                          
          for (i = 0; i < str1List.length && i < str2List.length; i++) {
                                  
          if (str1List[i] == str2List[i]) {
                                          longestStr.append(str1List[i]);
                                  } 
          else {
                                          
          break;
                                  }
                          }
                          String subStr1 
          = str1.substring(i);
                          String subStr2 
          = str2.substring(i);
                          
          if (i == 0) {
                                  String retStr1 
          = getLongestString(subStr1.substring(1), subStr2);
                                  String retStr2 
          = getLongestString(subStr1, subStr2.substring(1));
                                  String returnStr 
          = retStr1.length() >= retStr2.length() ? retStr1 : retStr2;
                                  map.put(key.toString(), returnStr);
                                  
          return returnStr;
                          } 
          else {
                                  String retStr1 
          = getLongestString(str1.substring(1), str2);
                                  String retStr2 
          = getLongestString(str1, str2.substring(1));
                                  String retStr 
          = retStr1.length() > retStr2.length() ? retStr1
                              : retStr2;
                                  String returnStr 
          = retStr.length() >= longestStr.toString().length() ? retStr
                                                  : longestStr.toString();
                                  map.put(key.toString(), returnStr);
                                  
          return returnStr;
                          }
                  }
           
          }

          HashMap用來存儲(chǔ)已經(jīng)計(jì)算過的字符串,用空間換時(shí)間。代碼當(dāng)然還可以優(yōu)化,您也可以一試身手哦。

          posted @ 2009-09-15 01:19 孔陽 閱讀(4445) | 評(píng)論 (7)編輯 收藏
          decorator裝飾模式的一種改進(jìn)寫法

          倘若,有這么一個(gè)需求,對(duì)于一個(gè)數(shù)字,如果是負(fù)的,那么需要變成正的相反數(shù),如果是2的倍數(shù),那么就除以2,如果是3的倍數(shù),那么就除以3,可能以后還有其他的需求,比如是5的倍數(shù),就再除以5,或者是6的倍數(shù),那么就加上6,也就是結(jié)果與順序息息相關(guān),那么應(yīng)該如何來實(shí)現(xiàn)呢?
          如果寫一個(gè)類的方法,按照這個(gè)需求來寫if語句,可以,但是,如果有兩套定制的呢?一套需要其中的幾種變化,另外需要另外幾種,那么就需要2個(gè)方法,而且其中有很多的重復(fù)代碼,這樣行不通的.
          其實(shí)設(shè)計(jì)模式說到底,其根本思想就是找到變化并封裝之.這里變化的是處理的方法,那么我們就把它封裝起來.實(shí)現(xiàn)的類如下:

          package decorater;

          public class Integor {
              
          private Integer x;

              
          public Integer getX() {
                  
          return x;
              }

              
          public void setX(Integer x) {
                  
          this.x = x;
              }
              Integor(Integer x){
                  
          this.x = x;
              }
          }
          由于Integer不能修改傳遞的值,所以寫一個(gè)類來封裝一個(gè)integer

          /**
           * 
           
          */
          package decorater;

          public abstract class Decorater {
              
          private Decorater next;

              
          public Decorater setNext(Decorater dcrtr) {
                  
          this.next = dcrtr;
                  
          return this.next;
              }

              
          public void process(Integor x) {
                  
          this.executeBefore(x);
                  
          if (this.next != null) {
                      
          this.next.process(x);
                  }
                  
          this.executeAfter(x);
              }

              
          protected abstract void executeBefore(Object x);

              
          protected abstract void executeAfter(Object x);

          }
          每個(gè)實(shí)現(xiàn)的類只需要來實(shí)現(xiàn)executeBefore和executeAfter方法即可.
          注意實(shí)現(xiàn)的順序是
          decorater1.executeBefore->decorater2.executeBefore->decorater3.executeBefore->decorater3.executeAfter->decorater2.executeAfter->decorater1.executerAfter

          package decorater;

          public class PositiveDecorater extends Decorater {

              @Override
              
          protected void executeAfter(Object x) {

                  System.out.println(
          "PositiveDecorater end!");
              }

              @Override
              
          protected void executeBefore(Object x) {
                  
          // TODO Auto-generated method stub

                  System.out.println(
          "starting PositiveDecorater!");
                  Integor in 
          = (Integor) x;
                  
          if (in.getX() < 0)
                      in.setX(
          -in.getX());
              }

          }

          package decorater;

          public class Devide2Decorater extends Decorater {

              @Override
              
          protected void executeAfter(Object x) {
                  System.out.println(
          "Devide2Decorater end!");

              }

              @Override
              
          protected void executeBefore(Object x) {
                  System.out.println(
          "Starting Devide2Decorater!");
                  Integor in 
          = (Integor) x;
                  
          if (in.getX() % 2 == 0) {
                      in.setX(in.getX() 
          / 2);
                  }

              }

          }

          package decorater;

          public class Devide3Decorater extends Decorater {

              @Override
              
          protected void executeAfter(Object x) {
                  System.out.println(
          "Devide3Decorater end!");
              }

              @Override
              
          protected void executeBefore(Object x) {

                  System.out.println(
          "Starting Devide3Decorater!");
                  Integor in 
          = (Integor) x;
                  
          if (in.getX() % 3 == 0) {
                      in.setX(in.getX() 
          / 3);
                  }

              }

          }

          /**
           * 
           
          */
          package decorater;

          /**
           * 
          @author KONGHE
           * 
           
          */
          public class Main {

              
          /**
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  Decorater a 
          = new PositiveDecorater();
                  a.setNext(
          new Devide2Decorater()).setNext(new Devide3Decorater());
                  Integor x 
          = new Integor(-18);
                  a.process(x);
                  System.out.println(x.getX());

              }

          }

          輸出結(jié)果是:
          starting PositiveDecorater!
          Starting Devide2Decorater!
          Starting Devide3Decorater!
          Devide3Decorater end!
          Devide2Decorater end!
          PositiveDecorater end!
          3

          其實(shí)每種設(shè)計(jì)模式的核心思想都是一致的,但是沒有必要照本宣科,只要注意其模式的精髓,就可以了,剩下的就是自己去按照實(shí)現(xiàn)來設(shè)計(jì)其中的細(xì)節(jié)了.比如我設(shè)計(jì)這個(gè)模式,就是先寫了main函數(shù),把其中的方法寫好,然后去按照這個(gè)實(shí)現(xiàn)來想去如何實(shí)現(xiàn),這樣才更符合解決實(shí)際的問題.其實(shí)decorater模式有很多種實(shí)現(xiàn)方式.比如下面的這種解法,也可:

          /**
           * 
           
          */
          package decorator;

          /**
           * 
          @author KONGHE
           * 
           
          */
          public class Main {

              
          /**
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  DecoraterChain a 
          = new DecoraterChain();
                  a.setNext(
          new PositiveDecorater()).setNext(new Devide2Decorater()).setNext(new Devide3Decorater());
                  Integer x 
          = -32;
                  x 
          = a.process(x);
                  System.out.println(x);

              }

          }

          /**
           * 
           
          */
          package decorator;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 
          @author KONGHE
           * 
           
          */
          public class DecoraterChain {
              
          private List<Decorater> decorater = new ArrayList<Decorater>();

              
          public DecoraterChain setNext(Decorater decrter) {
                  decorater.add(decrter);
                  
          return this;
              }

              
          public Integer process(Integer x) {
                  
          for (int i = 0; i < this.decorater.size(); i++) {
                      x 
          = this.decorater.get(i).process(x);
                  }
                  
          return x;
              }

          }

          /**
           * 
           
          */
          package decorator;


          /**
           * 
          @author KONGHE
           * 
           
          */
          public abstract class Decorater {
              
          public abstract Integer process(Integer x);

          }


          總而言之,模式是為了具體的實(shí)際情況而服務(wù)的,不要為了一定要去用某種設(shè)計(jì)模式而委屈自己的需求.
          在設(shè)計(jì)的時(shí)候多想想,可能某天你再讀設(shè)計(jì)模式的書,你會(huì)發(fā)現(xiàn),原來我之前寫的代碼,包含了這么多的設(shè)計(jì)模式啊!




          posted @ 2009-05-22 17:20 孔陽 閱讀(1381) | 評(píng)論 (3)編輯 收藏
          myeclipse開發(fā)struts, spring, hibernate配置注意要點(diǎn)(新手入門)


          1.確保以下幾個(gè)jar不在project build path里面,否則會(huì)出現(xiàn)各種沖突問題.
          c3p0-0.9.0.4.jar
          asm-2.2.3.jar
          hibernate-annotations.jar
          2.添加順序->spring,hibernate,struts
          3.修改 struts-config.xml
          action-mappings標(biāo)簽里面的type改為org.springframework.web.struts.DelegatingActionProxy
          例如:
          <action attribute="userSearchForm" input="/userSearch.jsp"
                      name="userSearchForm" path="/userSearch" scope="request"
                      type="org.springframework.web.struts.DelegatingActionProxy">
                      <forward name="success" path="success.jsp" />
          </action>
          最后加上
          <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
                  <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
          </plug-in>
          4.applicationContext.xml里面添加
          <bean name="/userSearch" class="com.oocl.struts.action.UserSearchAction">
                  <property name="actionLogDAO">
                      <ref bean="AlActionlogDAO" />
                  </property>
          </bean>
          這里的要注意,是name="/userSearch"不是id
          還有,要確認(rèn)好這個(gè)property的name一定要和你的bean class里面的field符合
          5.myEclipse添加spring,hibernate,struts支持的時(shí)候,盡量把所有的jar都包含進(jìn)來吧,然后把不需要的給刪除掉.


          posted @ 2009-02-20 16:34 孔陽 閱讀(737) | 評(píng)論 (0)編輯 收藏
          用myeclipse開發(fā)oc4j第一個(gè)webservice的簡(jiǎn)單示例

               摘要: 新建project.如下圖選擇, 建立好以后的目錄樹如圖:   添加新的webservice 接口和實(shí)現(xiàn)類。 依次選擇File->New->Other 如圖 點(diǎn)擊Finish. 雙擊編輯HelloWorldImpl.java 代碼如下: public class HelloWor...  閱讀全文

          posted @ 2009-02-11 10:21 孔陽 閱讀(1214) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 平顶山市| 江华| 揭东县| 诸城市| 北碚区| 五台县| 石嘴山市| 济南市| 黄梅县| 博乐市| 平山县| 宽甸| 乾安县| 饶河县| 天台县| 河南省| 桐柏县| 商河县| 吕梁市| 含山县| 沁源县| 镇巴县| 巴塘县| 长葛市| 壶关县| 汉阴县| 恩平市| 泰顺县| 拉孜县| 闵行区| 志丹县| 丽水市| 宾阳县| 台湾省| 卢湾区| 鹤峰县| 永仁县| 龙里县| 香格里拉县| 饶阳县| 亳州市|