<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    努力,成長,提高

    在追求中進步
    數據加載中……

    2009年2月20日

    html5 基于canvas的基礎類設計

    先給大家看一個demo
    http://www.koooi.com/html5/
    代碼很簡單
    頁面上面加一個<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);
    }

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

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

    posted @ 2010-06-13 02:07 孔陽 閱讀(1932) | 評論 (0)編輯 收藏
    用JAVA實現AI

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

    posted @ 2010-06-06 23:59 孔陽 閱讀(7873) | 評論 (5)編輯 收藏
    用動態規劃算法對最大子串問題的java實現

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

    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用來存儲已經計算過的字符串,用空間換時間。代碼當然還可以優化,您也可以一試身手哦。

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

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

    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不能修改傳遞的值,所以寫一個類來封裝一個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);

    }
    每個實現的類只需要來實現executeBefore和executeAfter方法即可.
    注意實現的順序是
    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());

        }

    }

    輸出結果是:
    starting PositiveDecorater!
    Starting Devide2Decorater!
    Starting Devide3Decorater!
    Devide3Decorater end!
    Devide2Decorater end!
    PositiveDecorater end!
    3

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

    /**
     * 
     
    */
    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);

    }


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




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


    1.確保以下幾個jar不在project build path里面,否則會出現各種沖突問題.
    c3p0-0.9.0.4.jar
    asm-2.2.3.jar
    hibernate-annotations.jar
    2.添加順序->spring,hibernate,struts
    3.修改 struts-config.xml
    action-mappings標簽里面的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
    還有,要確認好這個property的name一定要和你的bean class里面的field符合
    5.myEclipse添加spring,hibernate,struts支持的時候,盡量把所有的jar都包含進來吧,然后把不需要的給刪除掉.


    posted @ 2009-02-20 16:34 孔陽 閱讀(729) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 国产精品jizz在线观看免费 | 久久久久亚洲精品成人网小说| 91成人免费在线视频| 人妻18毛片a级毛片免费看| 亚洲精品亚洲人成在线麻豆| 国产亚洲精品看片在线观看 | 亚洲色偷偷综合亚洲AVYP| 日本无吗免费一二区| 1000部拍拍拍18勿入免费视频下载| 国产JIZZ中国JIZZ免费看| 欧美激情综合亚洲一二区| 亚洲依依成人精品| 色噜噜综合亚洲av中文无码| 亚洲熟妇av一区二区三区漫画| 四虎影视永久免费视频观看| 成人毛片免费视频| 嘿嘿嘿视频免费网站在线观看 | 亚洲精品高清久久| 亚洲VA中文字幕无码一二三区 | 国产亚洲精品免费视频播放| 深夜福利在线视频免费| 国产亚洲一卡2卡3卡4卡新区| 久久久国产亚洲精品| 99亚偷拍自图区亚洲| 亚洲午夜精品一区二区公牛电影院 | 噼里啪啦免费观看高清动漫4| 香港a毛片免费观看 | 在线观看免费a∨网站| 成年男女免费视频网站| 成人最新午夜免费视频| 18禁无遮挡无码网站免费| 免费在线观看的网站| 91香蕉视频免费| 女人张开腿给人桶免费视频| 成人毛片免费观看| 在线免费观看污网站| 日本免费网站观看| 一区二区三区亚洲视频| 亚洲婷婷国产精品电影人久久| 亚洲中文字幕丝袜制服一区| 亚洲最大av无码网址|