飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5133|回复: 10

[C/C++] 把三角函数思想运用到画菱形中

[复制链接]
  • TA的每日心情
    开心
    2019-3-17 22:44
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 2015-1-26 14:42:22 | 显示全部楼层 |阅读模式
    本帖最后由 tree_fly 于 2015-1-26 14:42 编辑

    大伙讨论菱形蛮激烈,也来凑个热闹~{:soso_e100:}   

    当然画菱形的方法真的很多,手痒痒了今天动手写了一段代码,望各位多多指点。

    1.如何判断一个坐标点是否在如下圆内?
    Snap_2015.01.26_06h19m10s_005_.jpg
    答案很简单,只要算出黄色坐标点到圆心的距离,和圆点半径比较即可。


    2.当我们面对一个菱形呢?
    Snap_2015.01.26_06h08m06s_004_.jpg

    我们假设坐标(0,0)位于菱形的最左顶点。
    有人会说,这个坐标是1:1关系的,是个正方形。这个很好理解,纵横坐标比值>1,菱形显得上下修长一些,反之左右修长一些,这些不影响我们分析。这里假设纵横坐标比例1:1。


    问题:如何判断黄色坐标点位于上图的菱形内呢?
    相信大家应该很容易理解,同时满足:
       1.坐标点P(Px,Py)与(0,0)点连线与x轴夹角α小于等于45度。
       2.坐标点P(Px,Py)与(10,0)点连线与x轴夹角β小于等于45度。


    事实上,tanα= Py/Px, tanβ= Py/(10-Px), tan45°=1
    处理x轴以下坐标点时候需要取绝对值了,大家自然明白。


    所以问题变成了:abs[Py/Px] <=1  , abs[Py/(10-Px)] <=1


    3.思路就是这样,下面用代码来实现试试。
    示例源码:C#。  
    1. class Program
    2.     {
    3.         static void Main(string[] args)
    4.         {
    5.             //1.Input
    6.             Console.Write("Please Input Number n (zero exit): ");

    7.             int n;
    8.             while ((n = int.Parse(Console.ReadLine())) > 0)
    9.             {
    10.                 //2.Draw
    11.                 double x, y;
    12.                 for (y = n - 1; y >= 0; y--)
    13.                 {
    14.                     for (x = 0; x <= n - 1; x++)
    15.                     {
    16.                         //2.1 预处理除数为0问题
    17.                         if (x == 0 | x == n - 1)
    18.                         {
    19.                             if (y == (n - 1) / 2) Console.Write("*");
    20.                             else Console.Write(" ");
    21.                             continue;
    22.                         }

    23.                         int t = 1;
    24.                         switch (t)
    25.                         {
    26.                             case 1:  //打印实心菱形
    27.                                 if ((Math.Abs((y - (n - 1) / 2) / x) <= 1) &
    28.                                     (Math.Abs((y - (n - 1) / 2) / (n - x - 1)) <= 1))

    29.                                     Console.Write("*");
    30.                                 else Console.Write(" ");
    31.                                 break;

    32.                             case 2:  //空心菱形
    33.                                 if ((Math.Abs((y - (n - 1) / 2) / x) == 1) |
    34.                                     (Math.Abs((y - (n - 1) / 2) / (n - x - 1)) == 1))

    35.                                     Console.Write("*");
    36.                                 else Console.Write(" ");
    37.                                 break;
    38.                         }
    39.                     }
    40.                     //WriteLine
    41.                     Console.WriteLine();
    42.                 }
    43.                 Console.Write("Please Input Number n (zero exit): ");
    44.             }
    45.         }
    46.     }
    复制代码


    Snap_2015.01.26_05h16m47s_001_.jpg




    打印效果:
    Snap_2015.01.26_05h17m43s_002_.jpg Snap_2015.01.26_05h18m18s_003_.jpg




    多多指点与交流。












    评分

    参与人数 1威望 +4 飘云币 +4 收起 理由
    lyl2012 + 4 + 4 PYG有你更精彩!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-4 14:31
  • 签到天数: 73 天

    [LV.6]常住居民II

    发表于 2015-1-26 16:19:29 | 显示全部楼层
    只能膜拜,正在学习.老Z就是这个逻辑设计的.
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    7 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2015-1-26 16:29:16 | 显示全部楼层
    专家、数学家!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-3-25 14:18
  • 签到天数: 881 天

    [LV.10]以坛为家III

    发表于 2015-1-26 18:52:29 | 显示全部楼层
    大牛级啊!我的就是配了很久才配出一个菱形
    学习了!!!
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2021-7-17 13:00
  • 签到天数: 975 天

    [LV.10]以坛为家III

    发表于 2015-1-26 19:13:52 | 显示全部楼层
    只能膜拜了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 20:35
  • 签到天数: 1815 天

    [LV.Master]伴坛终老

    发表于 2015-1-26 21:09:40 | 显示全部楼层
    看来要学好编程那必须是数学中的高手才行,膜拜一下
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-11-11 17:26
  • 签到天数: 449 天

    [LV.9]以坛为家II

    发表于 2015-1-27 09:03:07 | 显示全部楼层
    楼主分析问题思路敏捷,逻辑性强
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-2-26 11:14
  • 签到天数: 459 天

    [LV.9]以坛为家II

    发表于 2015-1-27 11:20:28 | 显示全部楼层
    楼主的数学真好  分析的更好
    再次验证了校长的话
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2024-4-13 20:08
  • 签到天数: 2046 天

    [LV.Master]伴坛终老

    发表于 2015-1-27 18:44:59 | 显示全部楼层
    这个代码我看得懂呀。。。。。{:soso_e113:}很多东西跟Java很像呀。。。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-11-1 20:51
  • 签到天数: 75 天

    [LV.6]常住居民II

    发表于 2015-1-28 14:18:11 | 显示全部楼层
    标题错了吧~~怎么看都是c# 而不是c++
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表