[原创]MIDP 1.0中 三角填充的不完整实现

protected void fillTriangleEx(Graphics g, int x1, int y1, int x2, int y2,
      int x3, int y3)
  {
    int INFINIT = -1;
    int a12, k12, a23, k23, a31, k31, a, k;
    int x_2, y_2, x_3, y_3, step, flag = 0, deltaK, k_12;
    
    //得到三条直线方程:
    // Y = (Y1 - Y2) / (X1 - X2) * (X - X1) + Y1
    // Y = (Y1 - Y3) / (X1 - X3) * (X - X1) + Y1;
    // Y = (Y3 - Y2) / (X3 - X2) * (X - X3) + Y3;
    // 令
    // A12 = (Y1 - Y2) / (X1 - X2);
    // K12 = Y1 - (Y1 - Y2) / (X1 - X2) * X1 = (X1 * Y2 - X2 * Y1) / (X1 - X2);
    // Y = A12 * X + K12; 
    //
    a12 = a23 = a31 = -1;
    k12 = k23 = k31 = -1;
    
    
    if ((x1 - x2) != 0)
    {
      a12 = (y1 - y2) * 1000 / (x1 - x2);
      k12 = (x1 * y2 - x2 * y1) * 1000 / (x1 - x2);
    }
    else return;
    
    if ((x2 - x3) != 0)
    {
      a23 = (y2 - y3) * 1000 / (x2 - x3);
      k23 = (x2 * y3 - x3 * y2) * 1000 / (x2 - x3);
    }
    else return;
    
    if ((x3 - x1) != 0)
    {
      a31 = (y3 - y1) * 1000 / (x3 - x1);
      k31 = (x3 * y1 - x1 * y3) * 1000 / (x3 - x1);
    }
    else return;
        
    
    
    //使用(X1, Y1) 与 (X2, Y2)这条线为底边.
    //平行向(X3, Y3)方向画线;
    //因些只要变化K(1,2)的值就可以画出来了.
    //但这里要确定出来这条线与其它两边的交点. 根据这些点来画出线段,
    //这样当(X3, Y3)的值知道时就可以确定K变化的步数step.

    for (int j = 0; j < 3; j++)
    {
      deltaK = (y3 - a12 * x3 / 1000 - k12 / 1000);
      if (deltaK < 0)
      {
        flag = -1;      
      }
      else if (deltaK > 0)
      {
        flag = 1;      
      }
      step = deltaK * flag;    
   
      //这样可以确定的是变化后与变化后的相交的交点在另外两边上的体现是
      //X'2 = (K' - K23) / (A23 - A12);
      //Y'2 = (A23 * K' - A12 * K23) / (A23 - A12);
      
      //X'3 = (K' - K31) / (A31 - A12);
      //Y'3 = (A31 * K' - A12 * K31) / (A31 - A12);
      k_12 = k12;
      
      g.setColor(0);
      
      for (int i = 0; i < step; i++)
      {
        x_2 =  ((k_12 - k23)/ (a23 - a12));
        y_2 =  ((a23 * k_12 - a12 * k23) / (a23 - a12)) / 1000;
        
        x_3 =  ((k_12 - k31) / (a31 - a12));
        y_3 =  ((a31 * k_12 - a12 * k31) / (a31 - a12)) / 1000;
        
        g.drawLine(x_2, y_2, x_3, y_3);
        k_12 += flag * 1000;
      }
      a = a12;
      k = k12;
      a12 = a23;
      k12 = k23;
      a23 = a31;
      k23 = k31;
      a31 = a;
      k31 = k;
   
    }    
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值