obj c car 各类已拆分(此程序不符合内存管理规则)

本文深入解析了汽车组装过程中的关键代码片段,从主函数main.m开始,逐步构建Engine、Tire和Car类,展示了Objective-C面向对象编程的精髓。通过实例代码,读者可以理解如何在iOS应用中实现复杂对象的创建和初始化。

xcode4.2

未了把代码看清楚,拆分

main.m:

//
//  main.m
//  carDemo
//
//  Created by Wunderman on 12-1-3.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Engine.h"
#import "Tire.h"
#import "Car.h"

int main (int argc, const char * argv[])
{

    @autoreleasepool {
        
        // insert code here...
        NSLog(@"Hello, World!");
        Car *car = [[Car alloc] init];
        
        Engine *engine = [[Engine alloc] init];
        [car setEngine: engine];
        int i;
        for (i=0; i<4; i++) {
            Tire *tire = [[Tire alloc] init];
            [tire setIndex: i];
            [car setTire:tire
                 atIndex:i];
        }
        [car print];
    }
    return 0;
}

 
//
//  Engine.h
//  carDemo
//
//  Created by Wunderman on 12-1-3.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Engine : NSObject
@end
 
//
//  Engine.m
//  carDemo
//
//  Created by Wunderman on 12-1-3.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import "Engine.h"

@implementation Engine
- (NSString *) description {
    return (@"I am a engine. Vrooom");
}
@end

 
//
//  Tire.h
//  carDemo
//
//  Created by Wunderman on 12-1-3.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Tire : NSObject {
    int index;
}
- (int) index;
- (void) setIndex : (int) i;
@end
//
//  Tire.m
//  carDemo
//
//  Created by Wunderman on 12-1-3.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import "Tire.h"

@implementation Tire
- (int) index {
    return index;  
};
- (void) setIndex : (int) i {
    index = i;
}

- (NSString *) description {
    //return (@"I am a tire. i'am in %d", index);
    NSString* sFormat = [[NSString alloc] initWithFormat: @"I am a tire. i'am in %d", index];
    NSString* string = [[NSString alloc] initWithString: sFormat];
    return string;
}

@end
//
//  Car.h
//  carDemo
//
//  Created by Wunderman on 12-1-3.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
@class Engine;
@class Tire;

@interface Car : NSObject {
    Engine *engine;
    Tire *tires[4];
}
//engine's get set
- (Engine *) engine;
- (void) setEngine : (Engine *) newEngine;

//tire's get set
- (Tire *)tireAtIndex: (int) index;
- (void) setTire: (Tire *) tire
         atIndex: (int) index;

- (void) print;
@end
 

 

//
//  Car.m
//  carDemo
//
//  Created by Wunderman on 12-1-3.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import "Car.h"

@implementation Car
- (Engine *) engine {
    return engine;
}

- (void) setEngine:(Engine *) newEngine {
    engine = newEngine;
}

- (Tire *)tireAtIndex: (int) index {
    if (index >3 || index < 0) {
        NSLog(@"bad index %d", index);
        exit(1);
    }
    return tires[index];
}

- (void) setTire: (Tire *) tire
         atIndex: (int) index {
    if (index >3 || index < 0) {
        NSLog(@"bad index %d", index);
        exit(1);
    }
    tires[index] = tire;
}

- (void) print {
    NSLog(@"%@", engine);
    NSLog(@"%@", tires[0]);
    NSLog(@"%@", tires[1]);
    NSLog(@"%@", tires[2]);
    NSLog(@"%@", tires[3]);
}
@end
 

 

 

 

 

 

 

 

(defun c:ZKK () (vl-load-com) (princ "\n曲面展开放样工具 v3.0 - 优化版") (setq startTime (getvar "TDUSRTIMER")) ; 记录开始时间 (使用计时器变量) (setq ent (car (entsel "\n选择曲面实体: "))) (if (null ent) (princ "\n未选择对象") (progn (setq objType (cdr (assoc 0 (entget ent)))) (initget 7) ; 禁止空输入 (setq uSteps (getint "\nU向分段数 (1-100) <20>: ")) (if (or (null uSteps) (<= uSteps 0) (> uSteps 100)) (setq uSteps 20) ) (initget 7) (setq vSteps (getint "\nV向分段数 (1-50) <10>: ")) (if (or (null vSteps) (<= vSteps 0) (> vSteps 50)) (setq vSteps 10) ) (setq params (getSurfaceParams ent objType)) ; 获取曲面参数 (if params (progn (setq ptList (createParametricGrid params uSteps vSteps)) ; 创建参数化网格 (if (not ptList) (princ "\n错误:无法创建参数化网格") (progn (setq faceList (generateUnfoldedMesh ptList uSteps vSteps)) ; 生成展开网格 (if (not faceList) (princ "\n错误:无法生成展开网格") (progn (drawUnfoldedSurface faceList) ; 绘制展开图 (setq area (calculateSurfaceArea ptList uSteps vSteps)) (princ (strcat "\n成功展开曲面!\n" "展开面积: " (rtos area 2 2) " 平方单位\n" "分段设置: U=" (itoa uSteps) ", V=" (itoa vSteps) "\n" "耗时: " (rtos (- (getvar "TDUSRTIMER") startTime) 2 2) " 秒")) ) ) ) ) (princ "\n支持的曲面类型,请选择圆柱面、圆锥面、直纹曲面或样条曲面") ) ) (princ) ) (defun getSurfaceParams (ent objType) (setq obj (vlax-ename->vla-object ent)) (setq objName (vla-get-objectname obj)) (cond ((wcmatch objName "*Cylinder") ; 圆柱面 (list 'cylinder obj)) ((wcmatch objName "*Cone") ; 圆锥面 (list 'cone obj)) ((wcmatch objName "*RuledSurface") ; 直纹曲面 (list 'ruled obj)) ((wcmatch objName "*SplineSurface") ; 样条曲面 (list 'spline obj)) (t nil) ) ) (defun createParametricGrid (params uSteps vSteps) (if (not (and (listp params) (> (length params) 1))) (progn (princ "\n错误:曲面参数无效") nil ) (progn (setq ptGrid '()) (setq du (/ 1.0 (float uSteps))) (setq dv (/ 1.0 (float vSteps))) (setq i 0) (repeat (1+ uSteps) (setq u (* (float i) du)) (setq vList '()) (setq j 0) (repeat (1+ vSteps) (setq v (* (float j) dv)) (setq pt (evaluateSurface params u v)) ; 曲面求值函数 (setq vList (cons pt vList)) (setq j (1+ j)) ) (setq ptGrid (cons (reverse vList) ptGrid)) (setq i (1+ i)) ) (reverse ptGrid) ) ) ) (defun evaluateSurface (params u v) (cond ((eq (car params) 'cylinder) (setq obj (cadr params)) (setq rad (vla-get-radius obj)) (setq height (vla-get-height obj)) (setq ang (* u 2.0 pi)) (list (* rad (cos ang)) (* rad (sin ang)) (* v height) ) ) ((eq (car params) 'cone) (setq obj (cadr params)) (setq baseRad (vla-get-radius obj)) (setq height (vla-get-height obj)) (setq rad (* baseRad (1- v))) ; 圆锥半径随高度线性变化 (setq ang (* u 2.0 pi)) (list (* rad (cos ang)) (* rad (sin ang)) (* v height) ) ) ((eq (car params) 'ruled) (setq obj (cadr params)) (setq curve1 (vla-get-curve1 obj)) (setq curve2 (vla-get-curve2 obj)) (if (and curve1 curve2) (progn (setq pt1 (vlax-curve-getPointAtParam curve1 u)) (setq pt2 (vlax-curve-getPointAtParam curve2 u)) (if (and pt1 pt2) (list (+ (car pt1) (* v (- (car pt2) (car pt1)))) (+ (cadr pt1) (* v (- (cadr pt2) (cadr pt1)))) (+ (caddr pt1) (* v (- (caddr pt2) (caddr pt1)))) ) (list 0.0 0.0 0.0) ) ) (list 0.0 0.0 0.0) ) ) ((eq (car params) 'spline) (setq obj (cadr params)) (if (vlax-method-applicable-p obj 'GetPointAtParam) (vlax-invoke obj 'GetPointAtParam u v) (progn (princ "\n样条曲面支持参数化求值") (list 0.0 0.0 0.0) ) ) ) (t (list 0.0 0.0 0.0)) ) ) (defun generateUnfoldedMesh (ptGrid uSteps vSteps) (if (or (null ptGrid) (/= (length ptGrid) (1+ uSteps))) (progn (princ "\n错误:参数化网格结构无效") nil ) (progn (setq faces '()) (setq ptIndex (make-hash-table)) ; 创建点坐标哈希表用于去重 (setq i 0) (while (<= i uSteps) (setq j 0) (while (<= j vSteps) (setq pt (nth j (nth i ptGrid))) (setq key (strcat (rtos (car pt) 2 6) "," (rtos (cadr pt) 2 6) "," (rtos (caddr pt) 2 6))) (if (not (hash-table-exists-p ptIndex key)) (puthash key pt ptIndex) ) (setq j (1+ j)) ) (setq i (1+ i)) ) (setq faces '()) (setq i 0) (while (< i uSteps) (setq j 0) (while (< j vSteps) (setq p1 (nth j (nth i ptGrid))) (setq p2 (nth j (nth (1+ i) ptGrid))) (setq p3 (nth (1+ j) (nth (1+ i) ptGrid))) (setq p4 (nth (1+ j) (nth i ptGrid))) (setq faces (cons (list p1 p2 p4) faces)) (setq faces (cons (list p2 p3 p4) faces)) (setq j (1+ j)) ) (setq i (1+ i)) ) (princ (strcat "\n网格优化: 共处理 " (itoa (hash-table-count ptIndex)) " 个唯一顶点")) faces ) ) (defun drawUnfoldedSurface (faces) (if (null faces) (princ "\n错误:未生成有效的展开面") (foreach face faces (entmakex (list '(0 . "3DFACE") (cons 10 (car face)) (cons 11 (cadr face)) (cons 12 (caddr face)) (cons 13 (caddr face)) ; 重复第三个点作为第四个点 ) ) ) ) ) (defun calculateSurfaceArea (ptGrid uSteps vSteps) (if (or (null ptGrid) (/= (length ptGrid) (1+ uSteps))) (progn (princ "\n错误:参数化网格结构无效") 0.0 ) (progn (setq area 0.0) (setq i 0) (while (< i uSteps) (setq j 0) (while (< j vSteps) (setq p1 (nth j (nth i ptGrid))) (setq p2 (nth j (nth (1+ i) ptGrid))) (setq p3 (nth (1+ j) (nth (1+ i) ptGrid))) (setq p4 (nth (1+ j) (nth i ptGrid))) (setq area (+ area (triangleArea p1 p2 p4) (triangleArea p2 p3 p4) )) (setq j (1+ j)) ) (setq i (1+ i)) ) area ) ) ) (defun triangleArea (p1 p2 p3) (if (or (null p1) (null p2) (null p3)) 0.0 (progn (setq a (distance p1 p2)) (setq b (distance p2 p3)) (setq c (distance p3 p1)) (setq s (/ (+ a b c) 2.0)) (if (<= (* s (- s a) (- s b) (- s c)) 0.0) 0.0 (sqrt (abs (* s (- s a) (- s b) (- s c)))) ) ) ) ) (defun start-message () (princ "\n曲面展开命令 ZKK 已加载\n使用方法: 在命令行输入 ZKK 并按提示操作\n支持类型: 圆柱面、圆锥面、直纹曲面、样条曲面\n优化特性: 顶点去重、性能计时、参数范围限制") (princ) ) (start-message)
最新发布
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值