public KjStroke getSimplified(){
		KjStroke result = new KjStroke();
		KjStroke reduced = removeSamePoint();//getReducedNoise().removeSamePoint();
		
		if (reduced.size()<=2){
			for(int i=0;i<reduced.size();i++){
				result.addPoint(reduced.getPoint(i));
			}
		} else {
			result.addPoint(reduced.getPoint(0));
			
			int i3 = 0;
			Point p1, p2, p3;
			for(int i=2;i<reduced.size();i++){
				p1 = reduced.getPoint(i);
				p3 = reduced.getPoint(i3);
				
				if (i3+1<i){
					Line2D line = new Line2D.Double();
					line.setLine(p1, p3);
					int maxJ = i3+1;
					double maxDist = line.ptLineDist(reduced.getPoint(maxJ));
					for(int j=i3+1;j<i;j++){
						double dist = line.ptLineDist(reduced.getPoint(j));
						if (maxDist<dist){
							maxDist = dist;
							maxJ = j;
						}
					}
					p2 = reduced.getPoint(maxJ);
					double angle1 = Math.atan2(p2.y-p3.y, p2.x-p3.x);
					double angle2 = Math.atan2(p1.y-p2.y, p1.x-p2.x);
					double angle = Math.abs(Math.toDegrees(angle2 - angle1));
					angle = Math.min(angle, 360-angle);
					if (angle>60){
						i3 = i;
						result.addPoint(p2);
					}
				}
			}
			result.addPoint(reduced.getPoint(reduced.size()-1));
		}
		//if (result.size()!=this.size()){
			return result.removeSamePoint().getSimplified2(1);
		//}
		//return result;
	}