精华内容
下载资源
问答
  • 内切和外切
    千次阅读
    2020-06-23 21:16:24

    c++中基类的继承及其使用,以圆的内接正方形和外切正方形为例

    1:C++中继承的方式
    C++中的继承主要分为三类:public公有继承、protected保护继承以及private私有继承,其使用范围这里不再赘述。
    2:C++继承的优缺点
    优点:
    1、类继承是在编译时刻静态定义的,且可直接使用,
    2、类继承可以较方便地改变父类的实现。
    缺点:
    1、因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现
    2、父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为
    3、如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

    例子——应用抽象类,求圆、圆内接正方形、圆外切正方形的面积和周长。

    
    ```cpp
    #include <iostream>
    #include <math.h>
    using namespace std;
    double pi=3.14;
    class container
    {
    	public:
    		container(double x){r=x;}
    		virtual void area()=0;
    		virtual void permeter()=0;
    	protected:
    		double r;
    };
    class circle:public container
    {
    	public:
    		circle(double x):container(x){}
    		void area()
    		{
    			cout<<"圆的面积是:"<<pi*r*r<<endl;
    		}
    		void permeter()
    		{
    			cout<<"圆的周长是:"<<pi*r*2<<endl;
    		}
    };
    class inner_square:public container
    {
    	public:
    		inner_square(double x):container(x){}
    		void area()
    		{
    			cout<<"圆内接正方形的面积为:"<<2*r*r<<endl;
    		}
    		void permeter()
    		{
    			cout<<"圆内接正方形的周长是:"<<4*sqrt(2)*r<<endl;
    		}
    };
    class out_square:public container
    {
    	public:
    		out_square(double x):container(x){}
    		void area()
    		{
    			cout<<"圆外切正方形的面积为:"<<4*r*r<<endl;
    		}
    		void permeter()
    		{
    			cout<<"圆外切正方形的周长是:"<<8*r<<endl;
    		}		
    };
    int main()
    {
    	container *p;
    	circle A(1);
    	inner_square B(1);
    	out_square C(1);
    	p=&A;
    	p->area();
    	p->permeter();
    	p=&B;
    	p->area();
    	p->permeter();
    	p=&C;
    	p->area();
    	p->permeter();
    	return 0;
    } 
    
    
    
    本例中,题干要求应用抽象类,求圆、圆内接正方形、圆外切正方形的面积和周长。分析三个对象的关系不难发现,三个对象在创建时都绕不开圆的半径“r”,都要求计算面积以及周长,因此在基类(container)中,可以将三者进行定义,方便接下来的继承。
    在继承过程中,要注意弄清不同类之间的关系,合理的使用虚基类以避免二义性。
    本例的主函数采用建立一个基类指针的方式调用各类函数,这样做能够精简主函数代码,也有利于后期主函数调用的修改。
    
    本人为大二计科学生,代码及表达能力有限,文中如有错误,欢迎大家指正!
    
    
    
    更多相关内容
  • 主要为大家详细介绍了python画出三角形外接圆和内切圆的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 行业文档-设计装置-“内切外曲”式足球运动鞋.zip
  • 教育科研-学习工具-“内切外曲”式足球运动鞋.zip
  • 高考数学中的内切和外接球问题.doc
  • 立体几何之内切和外接球习题集讲义教师版.doc
  • 三角形的内切圆与外切圆.pdf
  • 几何体的内切和外接球三视图教师版讲义全.docx
  • 2014年高考数学中的内切和外接球问题(附习题).doc
  • 包含最大接圆及外切圆M文件,实例程序以及实验结果
  • 高中数学
  • 八个无敌模型全搞定空间几何的接球和内切球问题.doc
  • 八个无敌模型——全搞定空间几何的接球和内切球问题.doc
  • 接球及内切球解题方法.doc
  • 高考接球内切球专题练习.doc
  • 内切球与接球常见解法[借鉴].pdf
  • 两圆的切线与切线的切点算法

    千次阅读 2019-10-26 14:59:12
    最近想画两球水滴效果所有在网上找两圆切点和内切点的算法,找了很久没有找到所以自己写了一个工具类来计算两圆的公切线点。具体效果如下图: 根据CircleUtils类的getCircleTangentPointOut方法返回切点坐标...

    最近想画两球水滴效果所有在网上找两圆外切点和内切点的算法,找了很久没有找到所以自己写了一个工具类来计算两圆的公切线点。具体效果如下图:

    根据CircleUtils类的getCircleTangentPointOut方法返回外切点坐标[r1p1, r1p2, r2p1, r2p2],依次为左边圆的两个切点坐标和右边两个切点坐标。

    根据CircleUtils类的getCircleTangentPointIn方法返回外切点坐标[r1p1, r1p2, r2p1, r2p2],依次为左边圆的两个切点坐标和右边两个切点坐标。

    根据获取坐标绘制线段和点,如下代码

    
            @Override
            protected void onDraw(Canvas canvas) {
                super.onDraw(canvas);
                mPaint.setColor(0XFF00FF00);
                mPaint.setStyle(Paint.Style.FILL);
                float r1 = 300;
                float r2 = 200;
                canvas.drawCircle(mDownX, mDownY, r1, mPaint);
                canvas.drawCircle(mCurrentX, mCurrentY, r2, mPaint);
                PointF[] points2 = CircleUtils.getCircleTangentPointOut(new PointF(mDownX, mDownY), r1, new PointF(mCurrentX, mCurrentY), r2);
                if (points2 != null) {
                    mPaint.setColor(0XFF0000FF);
                    mPaint.setStyle(Paint.Style.STROKE);
                    canvas.drawLine(points2[0].x, points2[0].y, points2[2].x, points2[2].y, mPaint);
                    canvas.drawLine(points2[1].x, points2[1].y, points2[3].x, points2[3].y, mPaint);
                }
                PointF[] points1 = CircleUtils.getCircleTangentPointIn(new PointF(mDownX, mDownY), r1, new PointF(mCurrentX, mCurrentY), r2);
                if (points1 != null) {
                    mPaint.setColor(0XFF0000FF);
                    mPaint.setStyle(Paint.Style.STROKE);
                    canvas.drawLine(points1[0].x, points1[0].y, points1[3].x, points1[3].y, mPaint);
                    canvas.drawLine(points1[1].x, points1[1].y, points1[2].x, points1[2].y, mPaint);
                }
                if (points2 != null) {
                    mPaint.setColor(0XFFFF0000);
                    mPaint.setStyle(Paint.Style.FILL);
                    for (PointF p : points2) {
                        canvas.drawCircle(p.x, p.y, 5, mPaint);
                    }
                }
                if (points1 != null) {
                    mPaint.setColor(0XFFFF0000);
                    mPaint.setStyle(Paint.Style.FILL);
                    for (PointF p : points1) {
                        canvas.drawCircle(p.x, p.y, 5, mPaint);
                    }
                }
            }

    CircleUtils工具类如下代码

    
    public class CircleUtils {
    
        //返回两圆外切点坐标
        public static PointF[] getCircleTangentPointOut(PointF c1, float r1, PointF c2, float r2){
            float centerLine = getPointDistance(c1, c2);
            if(centerLine > Math.abs(r1-r2)){
                //计算外切
                PointF[] points = new PointF[8];
                //圆心连线与圆1的交点
                PointF r1Point = ratioPoint(c1, c2, r1/centerLine);
                points[6] = r1Point;
                //圆心连线与圆2的交点
                PointF r2Point = ratioPoint(c1, c2, (centerLine-r2)/centerLine);
                points[7] = r2Point;
                //两元交点连线和两圆焦点在左边圆的角度
                float angleR1 = getAngle(r1, centerLine, r2);
                //两元交点连线和两圆焦点在右边圆的角度
                float angleR2 = getAngle(r2, centerLine, r1);
                //外切线与圆心连线的角度(0~90度之间的角度)
                float angle = (float) Math.acos(Math.abs(r1-r2)/centerLine);
                //两圆的交点
                points[4] = rotatePoint(r1Point, c1, angleR1);
                points[5] = rotatePoint(r2Point, c2, angleR2);
                if(r1>=r2){
                    //切线与第一个圆的交点
                    points[0] = rotatePoint(r1Point, c1, angle);
                    points[1] = rotatePoint(r1Point, c1, -angle);
                    //切线与第二个圆的交点
                    points[2] = rotatePoint(r2Point, c2, -(float) (Math.PI-angle));
                    points[3] = rotatePoint(r2Point, c2, (float) (Math.PI-angle));
                }else{
                    //切线与第一个圆的交点
                    points[0] = rotatePoint(r1Point, c1, (float) (Math.PI-angle));
                    points[1] = rotatePoint(r1Point, c1, -(float) (Math.PI-angle));
                    //切线与第二个圆的交点
                    points[2] = rotatePoint(r2Point, c2, -angle);
                    points[3] = rotatePoint(r2Point, c2, angle);
                }
                return points;
            }
            return null;
        }
    
        //返回两圆内切点坐标
        public static PointF[] getCircleTangentPointIn(PointF c1, float r1, PointF c2, float r2){
            float centerLine = getPointDistance(c1, c2);
            if(centerLine > r1+r2){
                //计算内切
                PointF[] points = new PointF[7];
                //内切线焦点
                points[4] = new PointF((c1.x*r2+c2.x*r1)/(r1+r2), (c1.y*r2+c2.y*r1)/(r1+r2));
                float l1 = centerLine*r1/(r1+r2);
                float l2 = centerLine*r2/(r1+r2);
                //圆心连线与圆1的交点
                points[5] = ratioPoint(c1, points[4], r1/l1);
                float angle = (float) Math.acos(r1/l1);
                //第1个圆的切点
                points[0] = rotatePoint(points[5], c1, angle);
                points[1] = rotatePoint(points[5], c1, -angle);
                //圆心连线与圆2的交点
                points[6] = ratioPoint(points[4], c2, (l2-r2)/l2);
                //第2个圆的切点
                points[2] = rotatePoint(points[6], c2, -angle);
                points[3] = rotatePoint(points[6], c2, angle);
                return points;
            }
            return null;
        }
    
        //根据点 a, b, c位置距离为ab, bc, ac获取b点在ac上的垂点d,返回垂点d
        public static PointF getVerticalPoint( PointF a, PointF b, PointF c){
            float ab =getPointDistance(a, b);
            float ac =getPointDistance(a, c);
            float bc =getPointDistance(b, c);
            return getVerticalPoint(ab, ac, bc, a, c);
        }
    
        public static PointF getVerticalPoint(float ab,float ac, float bc, PointF a, PointF c){
            float angle = getAngle(ab, ac, bc);
            float ratio = (float) (Math.cos(angle)*ab)/ac;
            return ratioPoint(a, c, ratio);
        }
    
        //返回两点之间的距离
        public static float getPointDistance(PointF a, PointF b){
            return (float) Math.sqrt(Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y, 2));
        }
    
        //根据点 a, b, c位置距离为ab, bc, ac获取a点角度
        public static float getAngle(float ab,float ac, float bc){
            return (float) Math.acos((ab*ab+ac*ac-bc*bc)/(2*ab*ac));
        }
    
        //获取一个点,起始点到该点长度除以起始点到结束点长度的比例为ratio
        public static PointF ratioPoint(PointF startPoint, PointF endPoint, float ratio){
            if(startPoint == null){
                startPoint = new PointF(0, 0);
            }
            PointF ret = new PointF();
            float x = endPoint.x-startPoint.x;
            float y = endPoint.y-startPoint.y;
            ret.x = x*ratio+startPoint.x;
            ret.y = y*ratio+startPoint.y;
            return ret;
        }
    
        //空间一个点围绕center点旋转angle角度后的位置
        public static PointF rotatePoint(PointF point, PointF center, float angle){
            if(center == null){
                center = new PointF(0, 0);
            }
            PointF ret = new PointF();
            //获取相对位置
            float x = point.x-center.x;
            float y = point.y-center.y;
            //根据选择矩阵旋转后加上中心点位置
            ret.x = (float) ((x*Math.cos(angle)-y*Math.sin(angle))+center.x);
            ret.y = (float) ((x*Math.sin(angle)+y*Math.cos(angle))+center.y);
            return ret;
        }
    }
    

     

    展开全文
  • 立体几何三视图球外切.doc
  • 难点突破立体图形的接球与内切球问题.pdf
  • 使用抽象类,求圆、圆接正方形外切正方形的面积周长。
  • AutoCAD二次开发C# 编程基础视频教程
  • 高中数学搞定空间几何体的接球及内切球学生版.doc
  • 几何体的接球与内切球满分突破10讲(模型齐全).pdf
  • AutoCAD二次开发C# 编程基础视频教程
  • 高中数学搞定空间几何体的接球与内切球学生版资料全.doc
  • 利用Fluent软件对IS100- 65-200型中比转速离心泵在正切和斜切2种叶轮切割方式下的内部流场进行数值模拟,分析不同叶轮切割量和切割角度下泵的特性和压力脉动特性。特性预测结果表明:正切时,随着切割量的增加,...
  • 给出了椭圆及其接、外切四边形与圆及其接、外切正方形仿射等价的充要条件。
  • 最新届高考空间几何体的接球与内切球问题专项突破复习参照.pdf
  • 外切内扎保留皮桥加内括约肌切断术医治环状混合痔.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 151,440
精华内容 60,576
关键字:

内切和外切