锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美一区二区三区日产,亚洲国产无套无码av电影,亚洲欧洲日产国码久在线观看http://m.tkk7.com/jiangshachina/category/38728.html鍚屾槸Java鐖卞ソ鑰咃紝鐩擱綍蹇呮浘鐩歌瘑錛?lt;br>    a cup of Java, cheers!zh-cnThu, 05 Jun 2014 10:23:55 GMTThu, 05 Jun 2014 10:23:55 GMT60鏍戠殑姹囨?鍘?http://m.tkk7.com/jiangshachina/archive/2009/06/26/283467.htmlSha JiangSha JiangThu, 25 Jun 2009 23:11:00 GMThttp://m.tkk7.com/jiangshachina/archive/2009/06/26/283467.htmlhttp://m.tkk7.com/jiangshachina/comments/283467.htmlhttp://m.tkk7.com/jiangshachina/archive/2009/06/26/283467.html#Feedback0http://m.tkk7.com/jiangshachina/comments/commentRss/283467.htmlhttp://m.tkk7.com/jiangshachina/services/trackbacks/283467.html 鏍戠殑姹囨?/span>
緇т笂嬈℃祬璋堜簡鏍戠殑閬嶅巻涔嬪悗錛岃繖嬈″啀嫻呰皥涓涓嬫爲鐨勬眹鎬匯?wbr>姝ゅ鐨勬眹鎬繪槸鎸囧皢鏍戜腑鏌愪釜鑺傜偣鐨勬暟鎹寜鎸囧畾鐨勮鍒欐眹闆嗗埌瀹冪殑鐖惰妭鐐逛腑銆?wbr>渚嬪錛屽彲浠ュ皢鏍戣妭鐐逛腑鐨勬暟鍊肩瘡鍔犲埌瀹冪殑鐖惰妭鐐逛腑銆?wbr>浠嶅鏍戠殑閬嶅巻涓鏂囷紝鎴戝皢浣跨敤涓ょ綆鍗曠殑綆楁硶錛岄掑綊涓庡拰榪唬錛?wbr>鏉ュ疄鐜拌繖涓鍔熻兘銆?2009.08.09鏈鍚庢洿鏂?

1. 鏍戣妭鐐?/span>
浠嶇劧娌跨敤鏍戠殑閬嶅巻涓鏂囦腑鐨凾reeNode/GenericTreeNode錛屼負渚夸簬闃呰錛?wbr>灝咷enericTreeNode涓殑鑻ュ共鍏抽敭灞炴у睍紺哄涓嬶紝
public class GenericTreeNode<T> implements TreeNode {

    
private T userObject = null;

    
private TreeNode parent = null;

    
private List<GenericTreeNode<T>> children = new ArrayList<GenericTreeNode<T>>();

    
}

2. 閫掑綊娉?/span>
浠嶇劧鍏堜粠鏈綆鍗曠殑閫掑綊娉曞紑濮嬶紝
public static Double recursiveGatherValue(GenericTreeNode<Double> node) {
    Double sumValue 
= null;
    
if (node.isLeaf()) {
        
return node.getUserObject();
    } 
else {
        sumValue 
= node.getUserObject();
        List
<GenericTreeNode<Double>> children = node.getChildren();
        
for (int i = 0, size = children.size(); i < size; i++) {
            Double bufGatherValue 
= recursiveGatherValue(children.get(i));
            sumValue 
+= bufGatherValue;
        }
    }

    node.setUserObject(sumValue);
    
return sumValue;
}
閫掑綊娉曡繕鏄竴濡傛棦寰鐨勭畝鍗曟槗鎳傘備笌閫掑綊閬嶅巻鏍戠浉姣旓紝閫掑綊姹囨繪爲鐨勭▼搴忓熀鏈笂娌″ぇ鐨勫彉鍖栵紝鎴戝氨涓嶈禈榪頒簡...

3. 榪唬娉?/span>
涓庤凱浠i亶鍘嗘爲鐩告瘮錛岃凱浠f眹鎬繪爲鐨勭▼搴忔湁涓浜涙槑鏄劇殑鍙樺寲銆?wbr>褰撳垵鍦ㄦ濊冭凱浠f硶鏃訛紝鏈変釜闂涓鐩村洶緇曠潃鎴戯細濡備綍灝嗕笅綰ц妭鐐圭殑鍊艱祴緇欏畠鐨勭埗鑺傜偣錛屽茍涓旂埗鑺傜偣鐨勫艱涓嶆柇鐨勮繘琛岀瘡鍔犮傚湪JavaWorld@TW涓彁鍑鴻繖涓棶棰樹箣鍚?wbr>錛屽緢蹇氨寰楀埌浜?a >娓呮櫚鐨勮В絳?/a>(鐪熺殑寰堟劅璋㈢ぞ鍖洪噷鐨勫ぇ澶т滑)銆?wbr>姣棤鐤戦棶錛岀敤榪唬娉曢亶鍘嗕竴媯墊爲鏃墮渶瑕佷嬌鐢ㄤ竴涓爤錛屼絾鍚屾椂錛屼負浜嗙淮鎶よ妭鐐逛笌姹囨誨間箣闂寸殑鍏崇郴錛?wbr>榪橀渶瑕佸彟涓涓爤榪涜杈呭姪銆傚叿浣撶▼搴忓涓嬫墍紺猴紝
public static void iterativeGatherValue(GenericTreeNode<Double> node) {
    Stack
<NodeValueTuple<Double>> nodeValueStack = new Stack<NodeValueTuple<Double>>();
    Stack
<GenericTreeNode<Double>> nodeStack = new Stack<GenericTreeNode<Double>>();

    nodeStack.push(node);
    Double sumValue 
= new Double(0.0D);
    
while (!nodeStack.isEmpty()) {
        GenericTreeNode
<Double> bufNode = nodeStack.pop();
        
if (bufNode == null) {
            NodeValueTuple
<Double> bufNodeValueTuple = nodeValueStack.pop();
        bufNodeValueTuple.node.setUserObject(sumValue);

        sumValue += bufNodeValueTuple.value;
        } 
else if (bufNode.isLeaf()) {
            sumValue 
+= bufNode.getUserObject();
        } 
else {
            nodeValueStack.add(
new NodeValueTuple<Double>(bufNode, sumValue));

            sumValue 
= new Double(0.0D);
            nodeStack.push(
null);
            nodeStack.addAll(bufNode.getChildren());
        }
    }
}
鍦ㄩ亶鍘嗘爲鐨勮繃紼嬩腑錛屼細灝嗘煇鑺傜偣N涓庡畠鐨勬眹鎬誨間竴鍚岀疆鍏ヤ竴涓爤(nodeValueStack)涓紝褰撹妭鐐筃鏈夊瓙鑺傜偣鏃訛紝鍒欏皢瀹冪殑瀛愯妭鐐瑰強鍏舵眹鎬誨間篃緗叆鏍堜腑錛岃妭鐐筃涓庡畠鐨勫瓙鑺傜偣涔嬮棿浣跨敤涓涓狽ULL鍊艱繘琛屽垎闅旓紱濡傛灉鑺傜偣N鏄彾鑺傜偣鍒欑瘡鍔犳眹鎬誨鹼紱濡傛灉鑺傜偣N涓篘ULL錛?wbr>鍒欒〃紺哄瓙鑺傜偣浠殑姹囨誨凡緇撴潫銆?br /> NodeValueTuple鏄竴涓簩鍏冪粍錛?wbr>鐢ㄤ簬緇存姢鑺傜偣涓庡畠鐨勬眹鎬誨間箣闂寸殑鍏崇郴錛屼唬鐮佸涓嬫墍紺猴紝
public class NodeValueTuple<V> {

    
public final GenericTreeNode<V> node;
    
public final V value;

    
public NodeValueTuple(GenericTreeNode<V> node, V value) {
        
this.node = node;
        
this.value = value;
    }
}
鍦ㄤ笂榪扮殑姹囨諱腑錛屽潎鍙瘡鍔犱簡鍙惰妭鐐逛腑鐨勬暟鍊鹼紝鑰屼笉綆″垎鏋濊妭鐐瑰拰鏍硅妭鐐規湰韜墍鎷ユ湁鐨勬暟鍊箋?wbr>濡傛灉瑕佺瘡鍔犺繖浜涜妭鐐規湰韜殑鏁板鹼紝搴旇濡備綍鍋氬憿錛?wbr>澶у鑷繁鍋氬仛鐪嬪惂錛岃偗瀹氶潪甯哥畝鍗?^_^

4. 灝忕粨
鏍戠殑姹囨昏偗瀹氭槸涓涓崄鍒嗗父瑙佺殑搴旂敤錛岄櫎浜嗘眹鎬繪暟鎹箣澶栵紝鎴戜滑榪樺彲浠ユ眹闆嗚妭鐐逛腑鐨勫璞★紝濡傛眹鎬繪寕杞藉湪鑺傜偣涓婄殑闆嗗悎瀵硅薄涓殑鍏冪礌錛?wbr>浣垮緱鐖惰妭鐐硅兘澶熸嫢鏈夋墍鏈夊瓙鑺傜偣鎵鎷ユ湁鐨勫厓绱犮備笂榪版柟娉曠殑鏁堢巼搴旇涓嶇畻浣庯紝涓昏鏄洜涓烘墍鏈夌殑鏍戣妭鐐瑰彧闇瑕佽闂竴嬈°?br />


Sha Jiang 2009-06-26 07:11 鍙戣〃璇勮
]]>
鏍戠殑閬嶅巻(鍘?http://m.tkk7.com/jiangshachina/archive/2009/04/01/263241.htmlSha JiangSha JiangWed, 01 Apr 2009 12:40:00 GMThttp://m.tkk7.com/jiangshachina/archive/2009/04/01/263241.htmlhttp://m.tkk7.com/jiangshachina/comments/263241.htmlhttp://m.tkk7.com/jiangshachina/archive/2009/04/01/263241.html#Feedback4http://m.tkk7.com/jiangshachina/comments/commentRss/263241.htmlhttp://m.tkk7.com/jiangshachina/services/trackbacks/263241.html
鏍戠殑閬嶅巻
涔嬪墠鐨勫伐浣滈兘娌℃湁鎺ヨЕ鍒版爲錛屼篃灝卞緢灝戠爺絀跺畠銆傚垢榪愬湴鐨勬槸錛屽湪鐩墠鐨勫伐浣滀腑澶氭閬囧埌鏍戝瀷緇撴瀯鐨勬暟鎹紝閭d箞璁塊棶鏍戣妭鐐逛腑鐨勬暟鎹氨鏄繀鐒剁殑浜嗭紝鑰屼笖榪橀渶瑕佹寜鐓ф寚瀹氳鍒欏鑺傜偣涓殑鏁版嵁榪涜棰濆澶勭悊銆傜粡榪囧涔犱箣鍚庯紝瀵逛笌鏍戠浉鍏崇殑鍩烘湰綆楁硶鏈変簡涓浜涜鐭ワ紝灝辮鍒掑啓鍑犵瘒灝忔枃銆傚叾瀹炶繖鏍風殑鏂囩珷鏃╁凡鏄睏鐗涘厖鏍嬶紝鑰屾垜鍙槸鎶婂畠褰撲綔鎴戠殑瀛︿範鎬葷粨緗簡錛屼互鍔犳繁璁板繂涓庣悊瑙o紝濡傝兘瀵瑰叾浠栨湅鍙嬫湁鎵鍔╃泭錛屽垯鏇存劅鎰夋偊浜?:-) (2009.04.03鏈鍚庢洿鏂?

榪欐鍏堜粠鏈鍩虹鐨勫紑濮?-鏍戠殑閬嶅巻銆傛湰鏂囦嬌鐢ㄤ簡涓ょ鏋佸父鐢ㄧ殑鏂規硶鏉ラ亶鍘嗘爲涓殑鎵鏈夎妭鐐?-閫掑綊錛涜凱浠o紝浣嗗畠浠疄鐜扮殑閮芥槸娣卞害浼樺厛(Depth-First)綆楁硶銆?br />
1. 鏍戣妭鐐逛笌鏁版嵁
鍏堝畾涔夋爲鑺傜偣鍙婃暟鎹?鐢ㄦ埛瀵硅薄)錛屽茍鍒涘緩嫻嬭瘯鐢ㄧ殑鏁版嵁銆?br /> TreeNode鏄爲鑺傜偣鐨勫畾涔夈?br />
/**
 * 鏍戣妭鐐圭殑瀹氫箟銆?br />  
*/
public interface TreeNode {

    
/**
     * 鑾峰彇鎸囧畾涓嬫爣澶勭殑瀛愯妭鐐廣?br />      * 
     * 
@param index
     *            涓嬫爣銆?br />      * 
@return 瀛愯妭鐐廣?br />      */
    
public TreeNode getChildAt(int index);

    
/**
     * 榪斿洖鎸囧畾瀛愯妭鐐圭殑涓嬫爣銆?br />      * 
     * 
@param index
     *            涓嬫爣銆?br />      * 
@return 瀛愯妭鐐廣?br />      */
    
public int getChildIndex(TreeNode index);

    
/**
     * 鑾峰彇瀛愯妭鐐圭殑鏁伴噺銆?br />      * 
     * 
@return 瀛愯妭鐐圭殑鏁伴噺銆?br />      */
    
public int getChildCount();

    
/**
     * 榪斿洖鐖惰妭鐐廣?br />      * 
     * 
@return 鐖惰妭鐐廣?br />      */
    
public TreeNode getParent();

    
/**
     * 璁劇疆鐖惰妭鐐廣傛敞錛氭澶勪笉闇瑕佹敼鍙樼埗鑺傜偣涓殑瀛愯妭鐐瑰厓绱犮?br />      * 
     * 
@param parent
     *            鐖惰妭鐐廣?br />      
*/
    
public void setParent(TreeNode parent);

    
/**
     * 鑾峰彇鎵鏈夌殑瀛愯妭鐐廣?br />      * 
     * 
@return 瀛愯妭鐐圭殑闆嗗悎銆?br />      */
    
public List<?> getChildren();

    
/**
     * 鏄惁涓哄彾鑺傜偣銆?br />      * 
     * 
@return 鏄彾鑺傜偣錛岃繑鍥瀟rue錛涘惁鍒欙紝榪斿洖false銆?br />      */
    
public boolean isLeaf();
}

GenericTreeNode鏄竴涓氱敤鐨勬爲鑺傜偣瀹炵幇銆?br />
public class GenericTreeNode<T> implements TreeNode {

    
private T userObject = null;

    
private TreeNode parent = null;

    
private List<GenericTreeNode<T>> children = new ArrayList<GenericTreeNode<T>>();

    
public GenericTreeNode(T userObject) {
        
this.userObject = userObject;
    }

    
public GenericTreeNode() {
        
this(null);
    }

    
/**
     * 娣誨姞瀛愯妭鐐廣?br />      * 
     * 
@param child
     
*/
    
public void addChild(GenericTreeNode<T> child) {
        children.add(child);
        child.setParent(
this);
    }

    
/**
     * 鍒犻櫎鎸囧畾鐨勫瓙鑺傜偣銆?br />      * 
     * 
@param child
     *            瀛愯妭鐐廣?br />      
*/
    
public void removeChild(TreeNode child) {
        removeChildAt(getChildIndex(child));
    }

    
/**
     * 鍒犻櫎鎸囧畾涓嬫爣澶勭殑瀛愯妭鐐廣?br />      * 
     * 
@param index
     *            涓嬫爣銆?br />      
*/
    
public void removeChildAt(int index) {
        TreeNode child 
= getChildAt(index);
        children.remove(index);
        child.setParent(
null);
    }

    
public TreeNode getChildAt(int index) {
        
return children.get(index);
    }

    
public int getChildCount() {
        
return children.size();
    }

    
public int getChildIndex(TreeNode child) {
        
return children.indexOf(child);
    }

    
public List<GenericTreeNode<T>> getChildren() {
        
return Collections.unmodifiableList(children);
    }

    
public void setParent(TreeNode parent) {
        
this.parent = parent;
    }

    
public TreeNode getParent() {
        
return parent;
    }

    
/**
     * 鏄惁涓烘牴鑺傜偣銆?br />      * 
     * 
@return 鏄牴鑺傜偣錛岃繑鍥瀟rue錛涘惁鍒欙紝榪斿洖false銆?br />      */
    
public boolean isRoot() {
        
return getParent() == null;
    }

    
public boolean isLeaf() {
        
return getChildCount() == 0;
    }

    
/**
     * 鍒ゆ柇鎸囧畾鐨勮妭鐐規槸鍚︿負褰撳墠鑺傜偣鐨勫瓙鑺傜偣銆?br />      * 
     * 
@param node
     *            鑺傜偣銆?br />      * 
@return 鏄綋鍓嶈妭鐐圭殑瀛愯妭鐐癸紝榪斿洖true錛涘惁鍒欙紝榪斿洖false銆?br />      */
    
public boolean isChild(TreeNode node) {
        
boolean result;
        
if (node == null) {
            result 
= false;
        } 
else {
            
if (getChildCount() == 0) {
                result 
= false;
            } 
else {
                result 
= (node.getParent() == this);
            }
        }

        
return result;
    }

    
public T getUserObject() {
        
return userObject;
    }

    
public void setUserObject(T userObject) {
        
this.userObject = userObject;
    }

    @Override
    
public String toString() {
        
return userObject == null ? "" : userObject.toString();
    }
}

UserObject鏄妭鐐逛笂鐨勭敤鎴峰璞★紝鐩稿綋浜庢槸鏁版嵁銆?br />
public class UserObject {

    
private String name = null;

    
private Integer value = Integer.valueOf(0);

    
public UserObject() {

    }

    
public UserObject(String code, Integer value) {
        
this.name = code;
        
this.value = value;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String code) {
        
this.name = code;
    }

    
public Integer getValue() {
        
return value;
    }

    
public void setValue(Integer value) {
        
this.value = value;
    }

    @Override
    
public String toString() {
        StringBuilder result 
= new StringBuilder();
        result.append(
"[name=").append(name).append(", value=").append(value).append("]");
        
return result.toString();
    }
}

TreeUtils鏄敤浜庡垱寤烘爲鐨勫伐鍏風被銆?br />
public class TreeUtils {

    
public static GenericTreeNode<UserObject> buildTree() {
        GenericTreeNode
<UserObject> root = new GenericTreeNode<UserObject>();
        root.setUserObject(
new UserObject("ROOT", Integer.valueOf(0)));

        GenericTreeNode
<UserObject> node1 = new GenericTreeNode<UserObject>();
        node1.setUserObject(
new UserObject("1", Integer.valueOf(0)));
        GenericTreeNode
<UserObject> node2 = new GenericTreeNode<UserObject>();
        node2.setUserObject(
new UserObject("2", Integer.valueOf(0)));
        GenericTreeNode
<UserObject> node3 = new GenericTreeNode<UserObject>();
        node3.setUserObject(
new UserObject("3", Integer.valueOf(5)));

        root.addChild(node1);
        root.addChild(node2);
        root.addChild(node3);

        GenericTreeNode
<UserObject> node11 = new GenericTreeNode<UserObject>();
        node11.setUserObject(
new UserObject("11", Integer.valueOf(0)));
        GenericTreeNode
<UserObject> node21 = new GenericTreeNode<UserObject>();
        node21.setUserObject(
new UserObject("21", Integer.valueOf(0)));

        node1.addChild(node11);
        node2.addChild(node21);

        GenericTreeNode
<UserObject> node111 = new GenericTreeNode<UserObject>();
        node111.setUserObject(
new UserObject("111", Integer.valueOf(3)));
        GenericTreeNode
<UserObject> node112 = new GenericTreeNode<UserObject>();
        node112.setUserObject(
new UserObject("112", Integer.valueOf(9)));
        GenericTreeNode
<UserObject> node211 = new GenericTreeNode<UserObject>();
        node211.setUserObject(
new UserObject("211", Integer.valueOf(6)));
        GenericTreeNode
<UserObject> node212 = new GenericTreeNode<UserObject>();
        node212.setUserObject(
new UserObject("212", Integer.valueOf(3)));

        node11.addChild(node111);
        node11.addChild(node112);
        node21.addChild(node211);
        node21.addChild(node212);

        
return root;
    }
}

2. 閫掑綊娉?/strong>
浣跨敤閫掑綊娉曠殑鏈澶уソ澶勫氨鏄?-綆鍗曪紝浣嗕竴鑸湴錛屾垜浠兘璁や負閫掑綊鐨勬晥鐜囦笉楂樸?br />
private static void recursiveTravel(GenericTreeNode<UserObject> node) {
    travelNode(node); 
// 璁塊棶鑺傜偣錛屼粎浠呭彧鏄墦鍗拌鑺傜偣緗簡銆?/span>
    List<GenericTreeNode<UserObject>> children = node.getChildren();
    
for (int i = 0; i < children.size(); i++) {
        recursiveTravel(children.get(i)); 
// 閫掑綊鍦拌闂綋鍓嶈妭鐐圭殑鎵鏈夊瓙鑺傜偣銆?/span>
    }
}
澶у鑲畾鐭ラ亾錛岀郴緇熷湪鎵ц閫掑綊鏂規硶(瀵逛簬鍏跺畠鏂規硶涔熸槸濡傛)鏃舵槸浣跨敤榪愯鏃舵爤銆傚鏂規硶鐨勬瘡涓嬈¤皟鐢紝鍦ㄦ爤涓兘浼氬垱寤轟竴浠芥嬈¤皟鐢ㄧ殑媧誨姩璁板綍--鍖呮嫭鏂規硶鐨勫弬鏁幫紝灞閮ㄥ彉閲忥紝榪斿洖鍦板潃錛屽姩鎬侀摼鎺ュ簱錛岃繑鍥炲肩瓑銆?br /> 鏃㈢劧緋葷粺鑳藉闅愬紡鍦頒嬌鐢ㄦ爤鍘繪墽琛岄掑綊鏂規硶錛岄偅涔堟垜浠氨鍙互鏄懼紡鍦頒嬌鐢ㄦ爤鏉ユ墽琛屼笂榪伴掑綊紼嬪簭錛岃繖涔熸槸灝嗛掑綊紼嬪簭杞寲涓鴻凱浠g▼搴忕殑甯哥敤鎬濇兂銆備笅闈㈢殑iterativeTravel鏂規硶灝辮繍鐢ㄤ簡榪欎竴鎬濇兂銆?br />
3. 榪唬娉?/strong>
private static void iterativeTravel(GenericTreeNode<UserObject> node) {
    Stack
<GenericTreeNode<UserObject>> nodes = new Stack<GenericTreeNode<UserObject>>();

    nodes.push(node); 
// 灝嗗綋鍓嶈妭鐐瑰帇鍏ユ爤涓?/span>
    while (!nodes.isEmpty()) {
        GenericTreeNode
<UserObject> bufNode = nodes.pop(); // 浠庢爤涓彇鍑轟竴涓妭鐐廣?/span>
        travelNode(bufNode); // 璁塊棶鑺傜偣銆?/span>
        if (!bufNode.isLeaf()) { // 濡傛灉璇ヨ妭鐐逛負鍒嗘灊鑺傜偣錛屽垯灝嗗畠鐨勫瓙鑺傜偣鍏ㄩ儴鍔犲叆鏍堜腑銆?/span>
            nodes.addAll(bufNode.getChildren());
        }
    }
}
涓庨掑綊娉曠浉姣旓紝榪唬娉曠殑浠g爜鐣ュ浜嗗嚑琛岋紝浣嗕粛鐒跺緢綆鍗曘?br />
4. 灝忕粨
鐢變簬涓婅堪涓ょ鏂規硶鍧?闅愬紡鎴栨樉寮忓湴)浣跨敤浜嗚繍琛屾爤錛屾墍浠ユ澶勭殑榪唬娉曞茍涓嶈兘鎻愰珮鏁翠釜紼嬪簭鐨勬晥鐜囥傜浉鍙嶅湴錛岀敱浜庡湪搴旂敤紼嬪簭涓樉寮忓湴浣跨敤鏍?java.util.Stack)錛宨terativeTravel鏂規硶鐨勬晥鐜囧彲鑳藉弽鑰屾洿浣庛備絾iterativeTravel鐨勬渶澶уソ澶勬槸錛岃兘澶熸湁鏁堝湴閬垮厤榪愯鏃舵爤婧㈠嚭(java.lang.StackOverflowError)銆?br /> 濡傛灉鏍戠殑灞傛涓嶅お娣憋紝姣忓眰鐨勫瓙鑺傜偣鏁頒笉澶錛岄偅涔堜嬌鐢ㄩ掑綊娉曞簲璇ユ槸娌℃湁闂鐨勩傛瘯绔燂紝綆媧佸湴紼嬪簭浼氭彁渚涙洿澶氱殑濂藉銆?br />


Sha Jiang 2009-04-01 20:40 鍙戣〃璇勮
]]>
鍒ゅ畾涓涓偣鏄惁鍦ㄤ笁瑙掑艦鍐?鍘?http://m.tkk7.com/jiangshachina/archive/2008/07/24/217214.htmlSha JiangSha JiangThu, 24 Jul 2008 09:02:00 GMThttp://m.tkk7.com/jiangshachina/archive/2008/07/24/217214.htmlhttp://m.tkk7.com/jiangshachina/comments/217214.htmlhttp://m.tkk7.com/jiangshachina/archive/2008/07/24/217214.html#Feedback13http://m.tkk7.com/jiangshachina/comments/commentRss/217214.htmlhttp://m.tkk7.com/jiangshachina/services/trackbacks/217214.html鍒ゅ畾涓涓偣鏄惁鍦ㄤ笁瑙掑艦鍐?/span>
濡備綍鍒ゅ畾涓涓偣P鏄惁瀛樺湪浜庢寚瀹氱殑涓夎褰BC鍐咃紝榪欒偗瀹氭槸涓涓畝鍗曠殑闂錛屾湰鏂囦粎鐢ㄤ竴涓浘褰㈢晫闈㈢▼搴忓睍紺轟簡璇ラ棶棰橈紝鏈夊叴瓚g殑鏈嬪弸鍙互鐪嬬湅銆?2008.07.24鏈鍚庢洿鏂?

鍦ㄦ澶勪嬌鐢ㄤ竴縐嶅父瑙佷笖綆渚跨殑鏂規硶錛?strong>濡傛灉涓夎褰AB錛孭AC鍜孭BC鐨勯潰縐箣鍜屼笌涓夎褰BC鐨勯潰縐浉絳夛紝鍗沖彲鍒ゅ畾鐐筆鍦ㄤ笁瑙掑艦ABC鍐?鍖呮嫭鍦ㄤ笁鏉¤竟涓?
銆?br /> 鍙煡錛岃鏂規硶鐨勫叧閿湪浜庡浣曡綆椾笁瑙掑艦鐨勯潰縐傚垢榪愬湴鏄紝褰撶煡閬撲笁瑙掑艦欏剁偣(A錛孊鍜孋)鐨勫潗鏍?(Ax, Ay)錛?Bx, By)鍜?Cx, Cy))涔嬪悗錛屽嵆鍙綆楀嚭鍏墮潰縐細
= |(Ax * By + Bx * Cy + Cx * Zy - Ay * Bx - By * Cx - Cy * Ax) / 2|

鍏抽敭鐨勪唬鐮佸涓嬶紝
// 鐢辯粰瀹氱殑涓変釜欏剁偣鐨勫潗鏍囷紝璁$畻涓夎褰㈤潰縐?br /> // Point(java.awt.Point)浠h〃鐐圭殑鍧愭爣銆?/span>
private static double triangleArea(Point pos1, Point pos2, Point pos3) {
    
double result = Math.abs((pos1.x * pos2.y + pos2.x * pos3.y + pos3.x * pos1.y
            
- pos2.x * pos1.y - pos3.x * pos2.y - pos1.x * pos3.y) / 2.0D);
    
return result;
}

// 鍒ゆ柇鐐筽os鏄惁鍦ㄦ寚瀹氱殑涓夎褰㈠唴銆?/span>
private static boolean inTriangle(Point pos, Point posA, Point posB,
        Point posC) {
    
double triangleArea = triangleArea(posA, posB, posC);
    
double area = triangleArea(pos, posA, posB);
    area 
+= triangleArea(pos, posA, posC);
    area 
+= triangleArea(pos, posB, posC);
    
double epsilon = 0.0001;  // 鐢變簬嫻偣鏁扮殑璁$畻瀛樺湪鐫璇樊錛屾晠鎸囧畾涓涓凍澶熷皬鐨勬暟錛岀敤浜庡垽瀹氫袱涓潰縐槸鍚?榪戜技)鐩哥瓑銆?/span>
    if (Math.abs(triangleArea - area) < epsilon) {
        
return true;
    }
    
return false;
}

鎵ц璇ュ簲鐢ㄧ▼搴忥紝鐢ㄩ紶鏍囧湪鍏朵腑鐐瑰嚮涓夋錛屽嵆鍙粯鍒朵竴涓笁瑙掑艦錛屽涓嬬粍鍥炬墍紺猴細

鐒跺悗浠呴渶縐誨姩榧犳爣錛屽氨浼氬嚭鐜頒竴涓┖蹇冨渾鍦堛傚鏋滃渾鍦堢殑涓績鍦ㄤ笁瑙掑唴(鍖呭惈鍦ㄤ笁鏉¤竟涓?錛屽垯鍦嗗湀鏄劇ず涓虹孩鑹詫紱鍚﹀垯錛屾樉紺轟負钃濊壊銆傚涓嬬粍鍥炬墍紺猴細


瀹屾暣浠g爜濡備笅錛?br />
public class CanvasPanel extends JPanel {

    
private static final long serialVersionUID = -6665936180725885346L;

    
private Point firstPoint = null;

    
private Point secondPoint = null;

    
private Point thirdPoint = null;

    
public CanvasPanel() {
        setBackground(Color.WHITE);
        addMouseListener(mouseAdapter);
        addMouseMotionListener(mouseAdapter);
    }

    
public void paintComponent(Graphics g) {
        
super.paintComponent(g);
        drawTriangel(g);
    }

    
private void drawTriangel(Graphics g) {
        
if (firstPoint != null && secondPoint != null) {
            g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
            
if (thirdPoint != null) {
                g.drawLine(firstPoint.x, firstPoint.y, thirdPoint.x, thirdPoint.y);
                g.drawLine(secondPoint.x, secondPoint.y, thirdPoint.x, thirdPoint.y);
            }
        }
    }

    
private static boolean inTriangle(Point pos, Point posA, Point posB,
            Point posC) {
        
double triangeArea = triangleArea(posA, posB, posC);
        
double area = triangleArea(pos, posA, posB);
        area 
+= triangleArea(pos, posA, posC);
        area 
+= triangleArea(pos, posB, posC);
        
double epsilon = 0.0001;
        
if (Math.abs(triangeArea - area) < epsilon) {
            
return true;
        }
        
return false;
    }

    
private static double triangleArea(Point pos1, Point pos2, Point pos3) {
        
double result = Math.abs((pos1.x * pos2.y + pos2.x * pos3.y + pos3.x * pos1.y
                           
- pos2.x * pos1.y - pos3.x * pos2.y - pos1.x * pos3.y) / 2.0D);
        
return result;
    }

    
private MouseInputAdapter mouseAdapter = new MouseInputAdapter() {

        
public void mouseReleased(MouseEvent e) {
            Point pos 
= e.getPoint();
            
if (firstPoint == null) {
                firstPoint 
= pos;
            } 
else if (secondPoint == null) {
                secondPoint 
= pos;
                Graphics g 
= CanvasPanel.this.getGraphics();
                CanvasPanel.
this.paintComponent(g);
                g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
            } 
else if (thirdPoint == null) {
                thirdPoint 
= pos;
                Graphics g 
= CanvasPanel.this.getGraphics();
                CanvasPanel.
this.paintComponent(g);
                g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
                g.drawLine(firstPoint.x, firstPoint.y, thirdPoint.x, thirdPoint.y);
                g.drawLine(secondPoint.x, secondPoint.y, thirdPoint.x, thirdPoint.y);
            }
        }

        
public void mouseMoved(MouseEvent e) {
            Point pos 
= e.getPoint();
            Graphics2D g2 
= (Graphics2D) CanvasPanel.this.getGraphics();
            CanvasPanel.
this.paintComponent(g2);
            
if (firstPoint != null && secondPoint == null) {
                g2.drawLine(firstPoint.x, firstPoint.y, pos.x, pos.y);
            } 
else if (firstPoint != null && secondPoint != null && thirdPoint == null) {
                g2.drawLine(firstPoint.x, firstPoint.y, pos.x, pos.y);
                g2.drawLine(secondPoint.x, secondPoint.y, pos.x, pos.y);
            } 
else if (firstPoint != null && secondPoint != null && thirdPoint != null) {
                
if (inTriangle(pos, firstPoint, secondPoint, thirdPoint)) {
                    g2.setColor(Color.RED);
                } 
else {
                    g2.setColor(Color.BLUE);
                }
                
int radius = 4;
                g2.drawOval(pos.x 
- radius, pos.y - radius, radius * 2, radius * 2);
            }
        }
    };
}

public class Triangle extends JFrame {

    
private static final long serialVersionUID = 1L;

    
private CanvasPanel mainPanel = null;

    
public Triangle() {
        setTitle(
"Triangle");
        setSize(
new Dimension(300200));
        setResizable(
false);

        init();

        Container container 
= getContentPane();
        container.add(mainPanel);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(
true);
    }

    
private void init() {
        mainPanel 
= new CanvasPanel();
    }

    
public static void main(String[] args) {
        
new Triangle();
    }
}



Sha Jiang 2008-07-24 17:02 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 国产精品亚洲AV三区| 久久ww精品w免费人成| 国产亚洲无线码一区二区| 99精品视频在线观看免费专区| 亚洲六月丁香婷婷综合| 亚洲精品国产电影| 最近免费mv在线电影| 久久亚洲AV成人无码国产电影| 亚洲人成网站在线观看播放| 四虎国产精品免费久久| 亚洲免费在线观看| 亚洲影院天堂中文av色| 亚洲国产精品福利片在线观看| 毛片免费观看的视频在线| a国产成人免费视频| 亚洲jizzjizz少妇| 色噜噜综合亚洲av中文无码| 哒哒哒免费视频观看在线www| 日韩视频在线观看免费| 欧美日韩亚洲精品| 亚洲人成7777影视在线观看| 国产亚洲精品无码拍拍拍色欲| 99精品国产免费久久久久久下载| 三级网站在线免费观看| 国产精品亚洲а∨无码播放麻豆| 91亚洲国产成人精品下载| 国产亚洲精品激情都市| 国产又大又黑又粗免费视频| 1000部拍拍拍18免费网站| 四虎影视无码永久免费| 免费无码专区毛片高潮喷水| 亚洲日韩精品无码专区加勒比| 亚洲成熟xxxxx电影| 久久精品夜色噜噜亚洲A∨| 国产乱子影视频上线免费观看| 无码国产精品一区二区免费| 91福利免费视频| 日本在线免费播放| 女同免费毛片在线播放| 91国内免费在线视频| 亚美影视免费在线观看|