improve pen thicknes calculations
This commit is contained in:
		@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					import 'dart:math';
 | 
				
			||||||
import 'dart:ui';
 | 
					import 'dart:ui';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:notes/canvas/my_painter.dart';
 | 
					import 'package:notes/canvas/my_painter.dart';
 | 
				
			||||||
@@ -52,26 +53,26 @@ class _DrawingPageState extends State<DrawingPage> {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  double _calcTiltedWidth(double baseWidth, double tilt) {
 | 
					  double _calcTiltedWidth(double baseWidth, double tilt) {
 | 
				
			||||||
 | 
					    if(tilt == .0) return baseWidth;
 | 
				
			||||||
    return baseWidth * tilt;
 | 
					    return baseWidth * tilt;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  double _calcAngleDependentWidth(List<Point> pts, double basetickness) {
 | 
					  double _calcAngleDependentWidth(Point pt1, Point pt2, double basetickness) {
 | 
				
			||||||
    return basetickness;
 | 
					    double dx = pt2.point.dx - pt1.point.dx;
 | 
				
			||||||
 | 
					    double dy = pt2.point.dy - pt1.point.dy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // todo do correct linear interpolation and extimate angle
 | 
					    // todo those deltas to small to get an accurate direction!
 | 
				
			||||||
    // final lininterpol = PolynomialInterpolation(
 | 
					
 | 
				
			||||||
    //     nodes: pts
 | 
					    double alpha = atan(dx / dy);
 | 
				
			||||||
    //         .map((e) => InterpolationNode(x: e.point.dx, y: e.point.dy))
 | 
					    // alpha has range from 0 - 2pi
 | 
				
			||||||
    //         .toList(growable: false));
 | 
					    // we want 0.5 -1;
 | 
				
			||||||
    // lininterpol.compute(1.0);
 | 
					
 | 
				
			||||||
    // print(lininterpol.buildPolynomial().toString());
 | 
					    alpha /= (2 * pi * 2);
 | 
				
			||||||
    //
 | 
					    alpha += .5;
 | 
				
			||||||
    // // double angle = atan((pt2.dy - pt1.dy)/(pt2.dx - pt1.dx));
 | 
					
 | 
				
			||||||
    //
 | 
					
 | 
				
			||||||
    // final angle = 5 / (2 * pi);
 | 
					    double thickness = basetickness * alpha;
 | 
				
			||||||
    // // print("pt1: ${pt1}, pt2: ${pt2}, angle: ${angle}");
 | 
					    return thickness;
 | 
				
			||||||
    //
 | 
					 | 
				
			||||||
    // return basetickness * (angle / .5 + .5);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // calculate new page offset from mousepointer delta
 | 
					  // calculate new page offset from mousepointer delta
 | 
				
			||||||
@@ -116,17 +117,12 @@ class _DrawingPageState extends State<DrawingPage> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      if (pts.last.point == pos) return;
 | 
					      if (pts.last.point == pos) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      double newWidth = _calcTiltedWidth(3.0, event.tilt);
 | 
					      double newWidth = _calcTiltedWidth(5.0, event.tilt);
 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (_strokes.last.points.length > 1) {
 | 
					      if (_strokes.last.points.length > 1) {
 | 
				
			||||||
        // todo current point not in list
 | 
					 | 
				
			||||||
        newWidth = _calcAngleDependentWidth(
 | 
					        newWidth = _calcAngleDependentWidth(
 | 
				
			||||||
            pts
 | 
					            pts.last, pts[pts.length - 2], newWidth);
 | 
				
			||||||
                .getRange(
 | 
					 | 
				
			||||||
                    pts.length - 10 >= 0 ? pts.length - 10 : 0, pts.length)
 | 
					 | 
				
			||||||
                .toList(growable: false),
 | 
					 | 
				
			||||||
            event.tilt);
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      setState(() {
 | 
					      setState(() {
 | 
				
			||||||
        _strokes = List.from(_strokes, growable: false)
 | 
					        _strokes = List.from(_strokes, growable: false)
 | 
				
			||||||
          ..last.addPoint(Point(pos, newWidth));
 | 
					          ..last.addPoint(Point(pos, newWidth));
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user