JavaTM 2 Platform
Standard Ed. 6

java.awt.geom
類別 Line2D

java.lang.Object
  繼承者 java.awt.geom.Line2D
所有已實作的介面:
Shape, Cloneable
直接已知子類別:
Line2D.Double, Line2D.Float

public abstract class Line2D
extends Object
implements Shape, Cloneable

Line2D 表示 (x,y) 坐標空間中的線段。像 Java 2D API 的全部類別一樣,此類別使用稱為使用者空間 的預設坐標系,其中 Y 軸的值向下增大,X 軸的值向右增大。有關使用者空間坐標系的更多資訊,請參閱 Java 2D Programmer's Guide 中的 Coordinate Systems 部分。

此類別是所有存儲 2D 線段的物件的惟一抽象父級類別。坐標的實際存儲表示形式由子類別決定。

從以下版本開始:
1.2

巢狀類別摘要
static class Line2D.Double
          使用 double 坐標指定的線段。
static class Line2D.Float
          使用 float 坐標指定的線段。
 
建構子摘要
protected Line2D()
          這是一個無法直接實例化的抽象類別。
 
方法摘要
 Object clone()
          創建一個與此物件具有相同類別的新物件。
 boolean contains(double x, double y)
          測試指定坐標是否在此 Line2D 物件的邊界內。
 boolean contains(double x, double y, double w, double h)
          測試此 Line2D 的內部是否完全包含指定矩形坐標集。
 boolean contains(Point2D p)
          測試給定 Point2D 是否在此 Line2D 的邊界內。
 boolean contains(Rectangle2D r)
          測試此 Line2D 內部是否完全包含指定的 Rectangle2D
 Rectangle getBounds()
          返回一個完全包圍 Shape 的整型 Rectangle
abstract  Point2D getP1()
          返回此 Line2D 的起始 Point2D
abstract  Point2D getP2()
          返回此 Line2D 的結束 Point2D
 PathIterator getPathIterator(AffineTransform at)
          返回定義此 Line2D 邊界的迭代物件。
 PathIterator getPathIterator(AffineTransform at, double flatness)
          返回定義此變平的 Line2D 邊界的迭代物件。
abstract  double getX1()
          返回起始點的 X 坐標(以 double 精度表示)。
abstract  double getX2()
          返回結束點的 X 坐標(以 double 精度表示)。
abstract  double getY1()
          返回起始點的 Y 坐標(以 double 精度表示)。
abstract  double getY2()
          返回結束點的 Y 坐標(以 double 精度表示)。
 boolean intersects(double x, double y, double w, double h)
          測試 Shape 內部是否與指定矩形區域的內部相交。
 boolean intersects(Rectangle2D r)
          測試 Shape 內部是否與指定 Rectangle2D 內部相交。
 boolean intersectsLine(double x1, double y1, double x2, double y2)
          測試從 (x1,y1)(x2,y2) 的線段是否與此線段相交。
 boolean intersectsLine(Line2D l)
          測試指定的線段是否與此線段相交。
static boolean linesIntersect(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
          測試從 (x1,y1)(x2,y2) 的線段是否與從 (x3,y3)(x4,y4) 的線段相交。
 double ptLineDist(double px, double py)
          返回從點到此線的距離。
static double ptLineDist(double x1, double y1, double x2, double y2, double px, double py)
          返回從點到線的距離。
 double ptLineDist(Point2D pt)
          返回從 Point2D 到此線的距離。
 double ptLineDistSq(double px, double py)
          返回從點到此線的距離的平方。
static double ptLineDistSq(double x1, double y1, double x2, double y2, double px, double py)
          返回從點到線的距離的平方。
 double ptLineDistSq(Point2D pt)
          返回從指定 Point2D 到此線的距離的平方。
 double ptSegDist(double px, double py)
          返回從點到此線段的距離。
static double ptSegDist(double x1, double y1, double x2, double y2, double px, double py)
          返回從點到線段的距離。
 double ptSegDist(Point2D pt)
          返回從 Point2D 到此線段的距離的平方。
 double ptSegDistSq(double px, double py)
          返回從點到此線段的距離的平方。
static double ptSegDistSq(double x1, double y1, double x2, double y2, double px, double py)
          返回從點到線段的距離的平方。
 double ptSegDistSq(Point2D pt)
          返回從 Point2D 到此線段的距離的平方。
 int relativeCCW(double px, double py)
          返回一個指示符,指示指定點 (px,py) 相對於此線段的位置。
static int relativeCCW(double x1, double y1, double x2, double y2, double px, double py)
          返回一個指示符,指示指定點 (px,py) 相對於從 (x1,y1)(x2,y2) 的線段的位置。
 int relativeCCW(Point2D p)
          返回一個指示符,指示指定 Point2D 相對於此線段的位置。
abstract  void setLine(double x1, double y1, double x2, double y2)
          將此 Line2D 的端點位置設置為指定的 double 坐標。
 void setLine(Line2D l)
          將此 Line2D 端點的位置設置為與指定 Line2D 的這些端點相同。
 void setLine(Point2D p1, Point2D p2)
          將此 Line2D 端點的位置設置為指定的 Point2D 坐標。
 
從類別 java.lang.Object 繼承的方法
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
從介面 java.awt.Shape 繼承的方法
getBounds2D
 

建構子詳細資訊

Line2D

protected Line2D()
這是一個無法直接實例化的抽象類別。特定於型別的實作子類別可用於實例化,並提供用於存儲滿足以下各種存取方法所需資訊的多種格式。

從以下版本開始:
1.2
另請參見:
Line2D.Float, Line2D.Double
方法詳細資訊

getX1

public abstract double getX1()
返回起始點的 X 坐標(以 double 精度表示)。

返回:
Line2D 物件起始點的 X 坐標。
從以下版本開始:
1.2

getY1

public abstract double getY1()
返回起始點的 Y 坐標(以 double 精度表示)。

返回:
Line2D 物件起始點的 Y 坐標。
從以下版本開始:
1.2

getP1

public abstract Point2D getP1()
返回此 Line2D 的起始 Point2D

返回:
Line2D 的起始 Point2D

getX2

public abstract double getX2()
返回結束點的 X 坐標(以 double 精度表示)。

返回:
Line2D 物件結束點的 X 坐標。
從以下版本開始:
1.2

getY2

public abstract double getY2()
返回結束點的 Y 坐標(以 double 精度表示)。

返回:
Line2D 物件結束點的 Y 坐標。
從以下版本開始:
1.2

getP2

public abstract Point2D getP2()
返回此 Line2D 的結束 Point2D

返回:
Line2D 的結束 Point2D
從以下版本開始:
1.2

setLine

public abstract void setLine(double x1,
                             double y1,
                             double x2,
                             double y2)
將此 Line2D 的端點位置設置為指定的 double 坐標。

參數:
x1 - 起始點的 X 坐標
y1 - 起始點的 Y 坐標
x2 - 結束點的 X 坐標
y2 - 結束點的 Y 坐標
從以下版本開始:
1.2

setLine

public void setLine(Point2D p1,
                    Point2D p2)
將此 Line2D 端點的位置設置為指定的 Point2D 坐標。

參數:
p1 - 線段的起始 Point2D
p2 - 線段的結束 Point2D
從以下版本開始:
1.2

setLine

public void setLine(Line2D l)
將此 Line2D 端點的位置設置為與指定 Line2D 的這些端點相同。

參數:
l - 指定的 Line2D
從以下版本開始:
1.2

relativeCCW

public static int relativeCCW(double x1,
                              double y1,
                              double x2,
                              double y2,
                              double px,
                              double py)
返回一個指示符,指示指定點 (px,py) 相對於從 (x1,y1)(x2,y2) 的線段的位置。返回值可以為 1、-1 或 0,指示為了指向指定點 (px,py),指定的線段必須繞其第一個端點 (x1,y1) 旋轉的方向。

返回值 1 指示線段轉動的方向是從 X 正半軸到 Y 負半軸。在 Java 2D 使用的預設坐標系中,此方向為逆時針方向。

返回值 -1 指示線段轉動的方向是從 X 正半軸到 Y 正半軸。在預設的坐標系中,此方向為順時針方向。

返回值 0 指示點恰好位於線段上。注意,指示符 0 是非常罕見的,並且因浮點捨入問題而不可用於確定共線性。

如果點與線段共線,但是不在端點之間,則點位於「(x1,y1) 之外」時值為 -1,點位於「(x2,y2) 之外」時值為 1。

參數:
x1 - 指定線段起始點的 X 坐標
y1 - 指定線段起始點的 Y 坐標
x2 - 指定線段結束點的 X 坐標
y2 - 指定線段結束點的 Y 坐標
px - 將與指定線段比較的指定點的 X 坐標
py - 將與指定線段比較的指定點的 Y 坐標
返回:
一個整數,指示第三個指定坐標相對於前兩個指定坐標所形成線段的位置。
從以下版本開始:
1.2

relativeCCW

public int relativeCCW(double px,
                       double py)
返回一個指示符,指示指定點 (px,py) 相對於此線段的位置。關於返回值的解釋,請參見 relativeCCW(double, double, double, double, double, double) 的方法註釋。

參數:
px - 將與此 Line2D 比較的指定點的 X 坐標
py - 將與此 Line2D 比較的指定點的 Y 坐標
返回:
一個整數,指示指定坐標相對於此 Line2D 的位置
從以下版本開始:
1.2
另請參見:
relativeCCW(double, double, double, double, double, double)

relativeCCW

public int relativeCCW(Point2D p)
返回一個指示符,指示指定 Point2D 相對於此線段的位置。關於返回值的解釋,請參見 relativeCCW(double, double, double, double, double, double) 的方法註釋。

參數:
p - 將與此 Line2D 比較的指定 Point2D
返回:
一個整數,指示指定 Point2D 相對於此 Line2D 的位置
從以下版本開始:
1.2
另請參見:
relativeCCW(double, double, double, double, double, double)

linesIntersect

public static boolean linesIntersect(double x1,
                                     double y1,
                                     double x2,
                                     double y2,
                                     double x3,
                                     double y3,
                                     double x4,
                                     double y4)
測試從 (x1,y1)(x2,y2) 的線段是否與從 (x3,y3)(x4,y4) 的線段相交。

參數:
x1 - 第一個指定線段起始點的 X 坐標
y1 - 第一個指定線段起始點的 Y 坐標
x2 - 第一個指定線段結束點的 X 坐標
y2 - 第一個指定線段結束點的 Y 坐標
x3 - 第二個指定線段起始點的 X 坐標
y3 - 第二個指定線段起始點的 Y 坐標
x4 - 第二個指定線段結束點的 X 坐標
y4 - 第二個指定線段結束點的 Y 坐標
返回:
如果第一個指定線段與第二個指定線段彼此相交,則返回 true;否則返回 false
從以下版本開始:
1.2

intersectsLine

public boolean intersectsLine(double x1,
                              double y1,
                              double x2,
                              double y2)
測試從 (x1,y1)(x2,y2) 的線段是否與此線段相交。

參數:
x1 - 指定線段起始點的 X 坐標
y1 - 指定線段起始點的 Y 坐標
x2 - 指定線段結束點的 X 坐標
y2 - 指定線段結束點的 Y 坐標
返回:
如果此線段與指定線段彼此相交,則返回 true;否則返回 false
從以下版本開始:
1.2

intersectsLine

public boolean intersectsLine(Line2D l)
測試指定的線段是否與此線段相交。

參數:
l - 指定的 Line2D
返回:
如果此線段與指定線段彼此相交,則返回 true;否則返回 false
從以下版本開始:
1.2

ptSegDistSq

public static double ptSegDistSq(double x1,
                                 double y1,
                                 double x2,
                                 double y2,
                                 double px,
                                 double py)
返回從點到線段的距離的平方。測量的距離是從指定點到位於指定端點間的最近點之間的距離。如果指定點與線段相交於端點之間,則此方法返回 0.0。

參數:
x1 - 指定線段起始點的 X 坐標
y1 - 指定線段起始點的 Y 坐標
x2 - 指定線段結束點的 X 坐標
y2 - 指定線段結束點的 Y 坐標
px - 將對照指定線段進行測量的指定點的 X 坐標
py - 將對照指定線段進行測量的指定點的 Y 坐標
返回:
一個 double 值,它是從指定點到指定線段的距離平方。
從以下版本開始:
1.2
另請參見:
ptLineDistSq(double, double, double, double, double, double)

ptSegDist

public static double ptSegDist(double x1,
                               double y1,
                               double x2,
                               double y2,
                               double px,
                               double py)
返回從點到線段的距離。測量的距離是從指定點到位於指定端點間的最近點之間的距離。如果指定點與線段相交於端點之間,則此方法返回 0.0。

參數:
x1 - 指定線段起始點的 X 坐標
y1 - 指定線段起始點的 Y 坐標
x2 - 指定線段結束點的 X 坐標
y2 - 指定線段結束點的 Y 坐標
px - 將對照指定線段進行測量的指定點的 X 坐標
py - 將對照指定線段進行測量的指定點的 Y 坐標
返回:
一個 double 值,它是從指定點到指定線段的距離。
從以下版本開始:
1.2
另請參見:
ptLineDist(double, double, double, double, double, double)

ptSegDistSq

public double ptSegDistSq(double px,
                          double py)
返回從點到此線段的距離的平方。測量的距離是從指定點到位於當前線端點間的最近點之間的距離。如果指定點與線段相交於端點之間,則此方法返回 0.0。

參數:
px - 將對照此線段進行測量的指定點的 X 坐標
py - 將對照此線段進行測量的指定點的 Y 坐標
返回:
一個 double 值,它是從指定點到當前線段的距離平方。
從以下版本開始:
1.2
另請參見:
ptLineDistSq(double, double)

ptSegDistSq

public double ptSegDistSq(Point2D pt)
返回從 Point2D 到此線段的距離的平方。測量的距離是從指定點到位於當前線端點間的最近點之間的距離。如果指定點與線段相交於端點之間,則此方法返回 0.0。

參數:
pt - 將對照此線段進行測量的指定 Point2D
返回:
一個 double 值,它是從指定 Point2D 到當前線段的距離平方。
從以下版本開始:
1.2
另請參見:
ptLineDistSq(Point2D)

ptSegDist

public double ptSegDist(double px,
                        double py)
返回從點到此線段的距離。測量的距離是從指定點到位於當前線端點間的最近點之間的距離。如果指定點與線段相交於端點之間,則此方法返回 0.0。

參數:
px - 將對照此線段進行測量的指定點的 X 坐標
py - 將對照此線段進行測量的指定點的 Y 坐標
返回:
一個 double 值,它是從指定點到當前線段的距離。
從以下版本開始:
1.2
另請參見:
ptLineDist(double, double)

ptSegDist

public double ptSegDist(Point2D pt)
返回從 Point2D 到此線段的距離的平方。測量的距離是從指定點到位於當前線端點間的最近點之間的距離。如果指定點與線段相交於端點之間,則此方法返回 0.0。

參數:
pt - 將對照此線段進行測量的指定 Point2D
返回:
一個 double 值,它是從指定 Point2D 到當前線段的距離。
從以下版本開始:
1.2
另請參見:
ptLineDist(Point2D)

ptLineDistSq

public static double ptLineDistSq(double x1,
                                  double y1,
                                  double x2,
                                  double y2,
                                  double px,
                                  double py)
返回從點到線的距離的平方。測量的距離是指定點與位於指定坐標定義的無限延長線上的最近點之間的距離。如果指定點與線相交,則此方法返回 0.0。

參數:
x1 - 指定線段起始點的 X 坐標
y1 - 指定線段起始點的 Y 坐標
x2 - 指定線段結束點的 X 坐標
y2 - 指定線段結束點的 Y 坐標
px - 將對照指定線段進行測量的指定點的 X 坐標
py - 將對照指定線段進行測量的指定點的 Y 坐標
返回:
一個 double 值,它是從指定點到指定線段的距離的平方。
從以下版本開始:
1.2
另請參見:
ptSegDistSq(double, double, double, double, double, double)

ptLineDist

public static double ptLineDist(double x1,
                                double y1,
                                double x2,
                                double y2,
                                double px,
                                double py)
返回從點到線的距離。測量的距離是指定點與位於指定坐標定義的無限延長線上的最近點之間的距離。如果指定點與線相交,則此方法返回 0.0。

參數:
x1 - 指定線段起始點的 X 坐標
y1 - 指定線段起始點的 Y 坐標
x2 - 指定線段結束點的 X 坐標
y2 - 指定線段結束點的 Y 坐標
px - 將對照指定線段進行測量的指定點的 X 坐標
py - 將對照指定線段進行測量的指定點的 Y 坐標
返回:
一個 double 值,它是從指定點到指定線段的距離。
從以下版本開始:
1.2
另請參見:
ptSegDist(double, double, double, double, double, double)

ptLineDistSq

public double ptLineDistSq(double px,
                           double py)
返回從點到此線的距離的平方。測量的距離是指定點與位於此 Line2D 定義的無限延長線上的最近點之間的距離。如果指定點與線相交,則此方法返回 0.0。

參數:
px - 將對照此線進行測量的指定點的 X 坐標
py - 將對照此線進行測量的指定點的 Y 坐標
返回:
一個 double 值,它是從指定點到當前線的距離平方。
從以下版本開始:
1.2
另請參見:
ptSegDistSq(double, double)

ptLineDistSq

public double ptLineDistSq(Point2D pt)
返回從指定 Point2D 到此線的距離的平方。測量的距離是指定點與位於此 Line2D 定義的無限延長線上的最近點之間的距離。如果指定點與線相交,則此方法返回 0.0。

參數:
pt - 將對照此線進行測量的指定 Point2D
返回:
一個 double 值,它是從指定 Point2D 到當前線的距離平方。
從以下版本開始:
1.2
另請參見:
ptSegDistSq(Point2D)

ptLineDist

public double ptLineDist(double px,
                         double py)
返回從點到此線的距離。測量的距離是指定點與位於此 Line2D 定義的無限延長線上的最近點之間的距離。如果指定點與線相交,則此方法返回 0.0。

參數:
px - 將對照此線進行測量的指定點的 X 坐標
py - 將對照此線進行測量的指定點的 Y 坐標
返回:
一個 double 值,它是從指定點到當前線的距離。
從以下版本開始:
1.2
另請參見:
ptSegDist(double, double)

ptLineDist

public double ptLineDist(Point2D pt)
返回從 Point2D 到此線的距離。測量的距離是指定點與位於此 Line2D 定義的無限延長線上的最近點之間的距離。如果指定點與線相交,則此方法返回 0.0。

參數:
pt - 要測量的指定 Point2D
返回:
一個 double 值,它是從指定 Point2D 到當前線的距離。
從以下版本開始:
1.2
另請參見:
ptSegDist(Point2D)

contains

public boolean contains(double x,
                        double y)
測試指定坐標是否在此 Line2D 物件的邊界內。此方法需要實作 Shape 介面,但是對於 Line2D 物件來說,它始終返回 false,因為線不包含任何區域。

指定者:
介面 Shape 中的 contains
參數:
x - 將被測試的指定點的 X 坐標
y - 將被測試的指定點的 Y 坐標
返回:
false,因為 Line2D 不包含任何區域。
從以下版本開始:
1.2

contains

public boolean contains(Point2D p)
測試給定 Point2D 是否在此 Line2D 的邊界內。此方法需要實作 Shape 介面,但是對於 Line2D 物件來說,它始終返回 false,因為線不包含任何區域。

指定者:
介面 Shape 中的 contains
參數:
p - 要測試的指定 Point2D
返回:
false,因為 Line2D 不包含任何區域。
從以下版本開始:
1.2

intersects

public boolean intersects(double x,
                          double y,
                          double w,
                          double h)
測試 Shape 內部是否與指定矩形區域的內部相交。如果任何一個點既包含在 Shape 內,又包含在指定矩形區域內,則認為矩形區域與 Shape 相交。

在下列情況下,Shape.intersects() 方法允許 Shape 實作謹慎地返回 true

這意味著對於某些 Shape,即使矩形區域沒有與該 Shape 相交,此方法也可能返回 true。如果需要更精確的答案,由於 Area 類別比大多數 Shape 物件更為準確地計算幾何相交,因此可以使用該類別。

指定者:
介面 Shape 中的 intersects
參數:
x - 指定矩形區域左上角的 X 坐標
y - 指定矩形區域左上角的 Y 坐標
w - 指定矩形區域的寬度
h - 指定矩形區域的高度
返回:
如果 Shape 的內部區域與矩形的內部區域相交,或者相交的可能性很大且執行計算的代價太高,則返回 true;否則返回 false
從以下版本開始:
1.2
另請參見:
Area

intersects

public boolean intersects(Rectangle2D r)
測試 Shape 內部是否與指定 Rectangle2D 內部相交。在下列情況下,Shape.intersects() 方法允許 Shape 實作謹慎地返回 true 這意味著對於某些 Shape,即使 Rectangle2D 沒有與該 Shape 相交,此方法也可能返回 true。如果需要更精確的答案,由於 Area 類別比大多數 Shape 物件更為準確地計算幾何相交,因此可以使用該類別。

指定者:
介面 Shape 中的 intersects
參數:
r - 指定的 Rectangle2D
返回:
如果 Shape 內部與指定 Rectangle2D 內部相交,或者相交的可能性很大且執行計算的代價太高,則返回 true;否則返回 false
從以下版本開始:
1.2
另請參見:
Shape.intersects(double, double, double, double)

contains

public boolean contains(double x,
                        double y,
                        double w,
                        double h)
測試此 Line2D 的內部是否完全包含指定矩形坐標集。此方法需要實作 Shape 介面,但是對於 Line2D 物件來說,它始終返回 false,因為線不包含任何區域。

指定者:
介面 Shape 中的 contains
參數:
x - 指定矩形區域的左上角的 X 坐標
y - 指定矩形區域的左上角的 Y 坐標
w - 指定矩形區域的寬度
h - 指定矩形區域的高度
返回:
false,因為 Line2D 不包含任何區域。
從以下版本開始:
1.2
另請參見:
Area, Shape.intersects(double, double, double, double)

contains

public boolean contains(Rectangle2D r)
測試此 Line2D 內部是否完全包含指定的 Rectangle2D。此方法需要實作 Shape 介面,但是對於 Line2D 物件來說,它始終返回 false,因為線不包含任何區域。

指定者:
介面 Shape 中的 contains
參數:
r - 要測試的指定 Rectangle2D
返回:
false,因為 Line2D 不包含任何區域。
從以下版本開始:
1.2
另請參見:
Shape.contains(double, double, double, double)

getBounds

public Rectangle getBounds()
返回一個完全包圍 Shape 的整型 Rectangle。注意,不保證返回的 Rectangle 是包圍 Shape 的最小邊界框,只保證 Shape 完全位於指示的 Rectangle 中。如果 Shape 超出了整數資料型別的有效範圍,則返回的 Rectangle 也可能不完全包圍 ShapegetBounds2D 方法由於在表示形式上具有更大的靈活性,所以通常返回更緊密的邊界框。

指定者:
介面 Shape 中的 getBounds
返回:
完全包圍 Shape 的整型 Rectangle
從以下版本開始:
1.2
另請參見:
Shape.getBounds2D()

getPathIterator

public PathIterator getPathIterator(AffineTransform at)
返回定義此 Line2D 邊界的迭代物件。此類別的迭代器不是多執行緒安全的,這意味著此 Line2D 類別不保證對此 Line2D 物件幾何形狀所作的修改不會影響該幾何形狀中正在進行的迭代。

指定者:
介面 Shape 中的 getPathIterator
參數:
at - 指定的 AffineTransform
返回:
定義此 Line2D 的邊界的 PathIterator
從以下版本開始:
1.2

getPathIterator

public PathIterator getPathIterator(AffineTransform at,
                                    double flatness)
返回定義此變平的 Line2D 邊界的迭代物件。此類別的迭代器不是多執行緒安全的,這意味著此 Line2D 類別不保證對此 Line2D 物件幾何形狀所作的修改不會影響該幾何形狀中正在進行的迭代。

指定者:
介面 Shape 中的 getPathIterator
參數:
at - 指定的 AffineTransform
flatness - 在由連接端點的直線取代細分曲線之前,給定曲線的控制點可以從共線變化的最大量。因為 Line2D 物件始終是平的,所以此參數會被忽略。
返回:
定義變平的 Line2D 邊界的 PathIterator
從以下版本開始:
1.2

clone

public Object clone()
創建一個與此物件具有相同類別的新物件。

覆寫:
類別 Object 中的 clone
返回:
此實例的一個副本。
拋出:
OutOfMemoryError - 如果沒有足夠的記憶體。
從以下版本開始:
1.2
另請參見:
Cloneable

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only