Files
2026-01-23 17:03:45 +08:00

306 lines
7.0 KiB
Java

//This file is part of SECONDO.
//Copyright (C) 2004, University in Hagen, Department of Computer Science,
//Database Systems for New Applications.
//SECONDO is free software; you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation; either version 2 of the License, or
//(at your option) any later version.
//SECONDO is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
//along with SECONDO; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package fuzzyobjects.simple;
import fuzzyobjects.basic.*;
import sj.lang.ListExpr;
/**
* provides fuzzy Segments
* @author Thomas Behr
*/
public class fSegment implements SimpleObject{
/**
* creates a new fuzzy segment
* @param BP_1 a endpoint
* @param Z1 the degree of fuzziness on BP_1
* @param BP_2 a endpoint
* @param Z2 the degre of fuzziness on BP_2
*/
public fSegment( BasicPoint BP_1, double Z1,
BasicPoint BP_2, double Z2) {
if ( BP_1.compareTo(BP_2)<0) {
this.EP_1 = BP_1;
this.Z1 = Z1;
this.EP_2 = BP_2;
this.Z2 = Z2;
}
else {
this.EP_1 = BP_2;
this.Z1 = Z2;
this.EP_2 = BP_1;
this.Z2 = Z1;
}
}
/**
* creates a new fSegment
* @param x1,y1 the location of endpoint 1
* @param Z1 degree of fuzziness of endpoint 1
* @param x2,y2 the location of the second endpoint
* @param Z2 degre of fuzziness of the second endpoint
*/
public fSegment(int x1, int y1, double Z1,
int x2, int y2, double Z2) {
this( (new BasicPoint(x1,y1)),Z1,
(new BasicPoint(x2,y2)),Z2);
}
/**
* creates a new fSegment
* @param BS the location of the new Segment
* @param Z1,Z2 the degree of fuzziness on both endpoints
*/
public fSegment(BasicSegment BS,double Z1,double Z2){
this(BS.getEP1(),Z1,BS.getEP2(),Z2);
}
/**
* returns the location of this segment
* @return the underlying Basicsegment
*/
public BasicObject basic(){
BasicSegment result = new BasicSegment(EP_1,EP_2);
return result;
}
/**
* creates a new fSegment
* @param SP_1 the first fuzzy endpoint
* @param SP_2 the second fuzzy endpoint
*/
public fSegment( fEPoint SP_1, fEPoint SP_2) {
this.EP_1 = (BasicPoint) SP_1.basic();
this.Z1 = SP_1.getZ();
this.EP_2 = (BasicPoint) SP_2.basic();
this.Z2 = SP_2.getZ();
if(EP_1.compareTo(EP_2)>0) {
BasicPoint BP = EP_1;
EP_1 = EP_2;
EP_2 = EP_1;
double Z = Z1;
Z1 = Z2;
Z2 = Z1;
}
}
/**
* returns a copy of this
* @return a new fSegment whith same
* location and fuzziness as this
*/
public fSegment copy(){
fSegment C = new fSegment(EP_1.copy(),Z1, EP_2.copy(),Z2);
return C;
}
/**
* check whether this is equal to fS
* @return true if this and fS have same
* location and fuzziness
*/
public boolean equals(fSegment fS) {
return EP_1.equals(fS.EP_1) && EP_2.equals(fS.EP_2) &&
(Z1 == fS.Z1) && (Z2 == fS.Z2);
}
/**
* check whether this and fS have the same location
* @return true if fS and this have the same underlying
* BasicSegment
*/
public boolean equalsBasic(fSegment fS) {
return this.basic().equals(fS.basic());
}
/**
* returns a readably form of this segment
* @return a String representing this segment
*/
public String toString() {
return "fS : ( (" + EP_1 + ","+Z1+") -> (" +
EP_2 + ","+Z2+"))";
}
/**
* check whether this segment is valid in the X-Triangulation
* @return true if the underlying BasicSegment is valid and
* the degrees of fuzziness are in [0,1] and exist a
* Point whith a degree greater then 0 in this segment
*/
public boolean isValid() {
if( (EP_1==null) || (EP_2==null)){
return false;
}
return EP_1.neightbooring(EP_2) && // is over a BasicLine
(Z1>=0) && (Z1<=1) && // Zi is in [0,1]
(Z2>=0) && (Z2<=1) &&
(Z1+Z2 >0); // not both Z are zero
}
/**
* returns the degree of fuzziness
* @return degree of fuzziness of the smallest point
*/
public double getZ1(){
return Z1;
}
/**
* returns the degree of fuzziness
* @return the degree of fuzziness of the greatest point
*/
public double getZ2(){
return Z2;
}
/**
* returns the smallest degree of fuzziness
*/
public double getMaxZ(){ return Math.max(Z1,Z2); }
/**
* returns the greatest degree of fuzziness
*/
public double getMinZ(){ return Math.min(Z1,Z2); }
/**
* returns the degree of fuzziness on a given point
* @params the given point
*/
public double Zfkt(BasicPoint BP){
double result=0.0;
if (BP.equals(EP_1)) result=Z1;
if (BP.equals(EP_2)) result=Z2;
return result;
}
/**
* returns the degree of fuzziness on a given point
* the point must be on basic of the segment
* @param x,y the geiven Point
*/
public double Zfkt(double x, double y){
// computes the membershipvalue of this Segment in (x,y)
// no check, wether (x,y) is on the Line !!!
double delta;
double x1 = EP_1.getX();
double x2 = EP_2.getX();
double y1 = EP_1.getY();
double y2 = EP_2.getY();
if (x1!=x2)
delta = (x-x1) /(x2-x1);
else
delta = (y- y1) /(y2-y1);
return Z1+delta*(Z2-Z1);
}
/** computes the length of this segment as 3D-line*/
public double length(){
double x1 = EP_1.getX();
double y1 = EP_1.getY();
double x2 = EP_2.getX();
double y2 = EP_2.getY();
return Math.sqrt( (x2-x1)*(x2-x1) +
(y2-y1)*(y2-y1) +
(Z2-Z1)*(Z2-Z1));
}
public int getMinX(){
return Math.min(EP_1.getX(),EP_2.getX());
}
public int getMinY(){
return Math.min(EP_1.getY(),EP_2.getY());
}
public int getMaxX(){
return Math.max(EP_1.getX(),EP_2.getX());
}
public int getMaxY(){
return Math.max(EP_1.getY(),EP_2.getY());
}
/** returns the ListExpr from this fSegment */
public ListExpr toListExpr(){
fEPoint P1 = new fEPoint(EP_1,Z1);
fEPoint P2 = new fEPoint(EP_2,Z2);
return ListExpr.twoElemList(P1.toListExpr(),P2.toListExpr());
}
/** set the values of ths fSegment to LE,
* if LE represent a valid FSegment
* @return true if LE is a valid fSegment
*/
public boolean readFromListExpr(ListExpr LE){
if(LE.listLength()!=2)
return false;
fEPoint P1 = new fEPoint(0,0,0);
fEPoint P2 = new fEPoint(0,0,0);
if(!( P1.readFromListExpr(LE.first()) &&
P2.readFromListExpr(LE.second())))
return false;
BasicPoint BP1 = (BasicPoint) P1.basic();
BasicPoint BP2 = (BasicPoint) P2.basic();
if (! BP1.neightbooring(BP2))
return false;
this.EP_1 = BP1;
this.EP_2 = BP2;
this.Z1 = P1.getZ();
this.Z2 = P2.getZ();
return true;
}
/* returns the first endpoint */
public fEPoint getP1(){
return new fEPoint(EP_1,Z1);
}
/* returns the second endpoint */
public fEPoint getP2(){
return new fEPoint(EP_2,Z2);
}
/** a BasicPoint */
private BasicPoint EP_1,
EP_2;
/** degree of fuzziness */
private double Z1,Z2;
}