热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

三角函数与万花尺(初稿)

本人语文能力不佳,叙述可能不是很清晰。如果谁能看到这篇文章,还请提出一些建议,毕竟这只是初稿。谢谢。书上说过,一个角θ的终边与单位圆的交点坐标为(cosθ,sinθ),我们

    本人语文能力不佳,叙述可能不是很清晰。如果谁能看到这篇文章,还请提出一些建议,毕竟这只是初稿。谢谢。

    书上说过,一个角θ的终边与单位圆的交点坐标为(cosθ,sinθ),我们很容易推导出角θ的终边与圆心位于原点、半径等于r的圆的交点坐标为(rcosθ,rsinθ)。当θ由0逐渐增大到2π时,我们就可以计算出圆上各点的坐标。当然,我们需要决定究竟计算几个点,这就是变量n的作用。由于大圆的位置是固定的,而小圆位置是不断变化的,所以大圆上各点的坐标可以直接加上大圆圆心的坐标来让大圆显示在窗口中一个确定的位置,而输出的小圆上各点坐标仍然是其相对于圆心的坐标。

    接下来,我们进行小圆圆心坐标和笔尖坐标的计算。首先,我们以大圆圆心为原点建立平面直角坐标系,并假定初始状态时小圆与大圆的切点在x轴正半轴上,设小圆绕大圆圆心逆时针转过的角度为α,即以x轴正半轴为α的始边,以原点向小圆圆心作的射线为α的终边。我们很容易判断两圆的切点也在α的终边上,那么两圆圆心间的距离就是两圆半径之差,而小圆圆心就在以这个距离为半径的圆周上运动。用ra表示大圆半径,rb表示小圆半径,则小圆的圆心坐标bx=ax+(ra-rb)*cosα,by=ay+(ra-rb)*sinα。之所以要加上大圆的圆心坐标,是为了得到小圆圆心在窗口中的绝对坐标,再加上前面得到的相对坐标,就可以显示小圆的运动了。可是,我们要注意的是,屏幕坐标的y轴的正方向是向下的,因此实际显示出的图形是上下翻转的,所以by应为ay-(ra-rb)*sinα。
    从万花尺的原理中,我们可以知道,两圆之间发生的是相对滚动而不是滑动,因此接触点在两圆圆周上移动的路程相同,意即两圆切点在两圆上移动的弧长相等。由于切点在α的终边上,所以α可以表示切点在大圆圆周上转过的圆心角,那么我们设切点在小圆圆周上转过的圆心角为β,就可以得到l=∣α∣*ra=∣β∣*rb。然而小圆相对于大圆圆心逆时针转动时其相对于自身的圆心是顺时针转动,因而α为正、β为负,所以α*ra=-β*rb,β=-(ra/rb)*α。不过,β是小圆相对于切点顺时针转过的角度,而切点本身还相对于小圆圆心逆时针转过了α角——我们过小圆圆心作一条平行于x轴的直线就会发现这个角与α是同位角——所以小圆相对于自身圆心顺时针转过的角度为α+β=(1-ra/rb)*α。显然,笔尖划过的角度也是(1-ra/rb)*α,因为笔尖在小圆上的位置是固定的,会随着小圆一起绕圆心转动。用d表示笔尖到小圆圆心的距离,并且设θ=(1-ra/rb)*α,那么与上文同理得笔尖的窗口坐标为x=bx+d*cosθ,y=by-d*sinθ。
#include
#include

int main(void){
    double d=50,ra=150,rb=50;
    int i,m=720,n=360;
    int ax,ay,bx,by,ax0=384,ay0=288;
    double alpha=0,theta=0;

    FILE *fp=NULL;
    fp=fopen("wanhuachi.txt","w");
 
    if(fp==NULL){
        return -1;
    }

    for(i=0;i 
 

这样,我们就得到了各点的坐标,然后我使用haribote操作系统来完成图形显示(见《30天自制操作系统》)。

#include "apilib.h"
int p[360*12]={};

void HariMain(void){

    int m=720,n=360;
    int win,buf,timer,i=0,j=4*n;
    api_initmalloc();
    buf = api_malloc(768 * 576);
    win = api_openwin(buf, 768, 576, -1, "wanhuachi");
    api_boxfilwin(win+1, 5, 24, 762, 570, 0);
    timer = api_alloctimer();
    api_inittimer(timer, 128);

    for (;;) {

        api_boxfilwin(win+1, 5, 24, 762, 570, 0);

        for(i=0;i<4*n;i+=4){
            api_point(win+1,p[i],p[i+1],3);
            api_point(win+1,p[j]+p[i+2],p[j+1]+p[i+3],4);
        }

        api_linewin(win+1,p[j],p[j+1],p[j+2],p[j+3],14);

        for(i=4*n;i<=j;i=i+4){
            api_point(win+1,p[i+2],p[i+3],3);
        }

        api_refreshwin(win, 5, 24, 762, 570);

        api_settimer(timer, 1);

        j+=4;
        if(j>=4*n+4*m){
            j=4*n;
        }

        if (api_getkey(1) != 128) {
            api_end();
        }
    }
}

程序很简单,运行效果与设想一样,证明我的思路是正确的。成功!



推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
author-avatar
直由飞翔_447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有