2012-01-14 61 views
0

我已经使用Quartz2D绘制iPod/iPhone的数学公式,下面是示例代码。如何在iOS设备中动态显示数学方程?

问题: 在我的应用程序中,我必须动态地显示大量这些方程。 我是否需要读取数据以便从plist(或某个其他存储器)动态绘制及其x/y坐标,然后绘制等式?现在我只是对数据和x/y坐标进行硬编码(,如下面的示例代码所示)。

- (void)drawRect:(CGRect)rect 
{ 
// Left hand side Starts -- 
float xaxis = 3.0f; 

// Before bracket 
NSString *textString = @"L"; 
[textString drawAtPoint:CGPointMake(xaxis, 50.) withFont:[UIFont fontWithName:@"Helvetica-Oblique" size:20]]; 

// Opening bracket 
xaxis += 12.0f; 
textString = @"("; 
[textString drawAtPoint:CGPointMake(xaxis, 30.) withFont:[UIFont fontWithName:@"Helvetica" size:50]]; 

textString = @"N"; 
xaxis += 12.0f; 
[textString drawAtPoint:CGPointMake(xaxis, 50.) withFont:[UIFont fontWithName:@"Helvetica-Oblique" size:20]]; 

// Numerator part 
unichar oneChar[] = {0x2206}; 
xaxis += 31.0f; 
textString = getTextString(oneChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 37.) withFont:[UIFont fontWithName:@"Helvetica" size:22]]; 

unichar twoChar[] = {0x03C9}; 
xaxis += 15.0f; 
textString = getTextString(twoChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 15.0f; 
textString = @"k"; 
[textString drawAtPoint:CGPointMake(xaxis, 48.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

// Line 
CGContextRef myContext = UIGraphicsGetCurrentContext();  
CGContextSetLineWidth(myContext, 2); 
CGContextSetStrokeColorWithColor(myContext, [UIColor blackColor].CGColor);  
CGContextMoveToPoint(myContext, 45, 65); 
CGContextAddLineToPoint(myContext, 110, 65); 
CGContextStrokePath(myContext); 

// Denominator part 
xaxis -= 40.0f; 
unichar threeChar[] = {0x03C9}; 
textString = getTextString(threeChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 64.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 15.0f; 
textString = @"res"; 
[textString drawAtPoint:CGPointMake(xaxis, 74.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

xaxis += 18.0f; 
unichar fourChar[] = {0x0028}; 
textString = getTextString(fourChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 64.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 5.0f; 
unichar fiveChar[] = {0x03B8}; 
textString = getTextString(fiveChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 64.) withFont:[UIFont fontWithName:@"Helvetica-Oblique" size:20]]; 

xaxis += 15.0f; 
textString = @")"; 
[textString drawAtPoint:CGPointMake(xaxis, 64.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

// Closing bracket 
xaxis += 8.0f; 
textString = @")"; 
[textString drawAtPoint:CGPointMake(xaxis, 30.) withFont:[UIFont fontWithName:@"Helvetica" size:50]]; 

// Equal to sign 
xaxis += 15.0f; 
unichar sixChar[] = {0x003D}; 
textString = getTextString(sixChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 50.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

// Right hand side Starts -- 

// Numerator part 
xaxis += 15.0f; 
textString = @"sin"; 
[textString drawAtPoint:CGPointMake(xaxis, 42.) withFont:[UIFont fontWithName:@"Helvetica" size:17]]; 

xaxis += 20.0f; 
textString = @"2"; 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

// Inner opening bracket 
xaxis += 10.0f; 
textString = @"("; 
[textString drawAtPoint:CGPointMake(xaxis, 37.) withFont:[UIFont fontWithName:@"Helvetica" size:22]]; 

xaxis += 8.0f; 
textString = @"N"; 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica-Oblique" size:20]]; 

xaxis += 18.0f; 
unichar sevenChar[] = {0x03C0}; 
textString = getTextString(sevenChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 40.) withFont:[UIFont fontWithName:@"Helvetica" size:17]]; 

xaxis += 12.0f; 
unichar eightChar[] = {0x2206}; 
textString = getTextString(eightChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 36.) withFont:[UIFont fontWithName:@"Helvetica" size:21]]; 

xaxis += 15.0f; 
unichar nineChar[] = {0x03C9}; 
textString = getTextString(nineChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 15.0f; 
textString = @"k"; 
[textString drawAtPoint:CGPointMake(xaxis, 47.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

xaxis += 8.0f; 
textString = @"/"; 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica" size:24]]; 

xaxis += 8.0f; 
unichar tenChar[] = {0x03C9}; 
textString = getTextString(tenChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 15.0f; 
textString = @"res"; 
[textString drawAtPoint:CGPointMake(xaxis, 48.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

xaxis += 18.0f; 
textString = @"("; 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 5.0f; 
unichar elevenChar[] = {0x03B8}; 
textString = getTextString(elevenChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica-Oblique" size:20]]; 

xaxis += 12.0f; 
textString = @")"; 
[textString drawAtPoint:CGPointMake(xaxis, 38.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

// Inner closing bracket 
xaxis += 6.0f; 
textString = @")"; 
[textString drawAtPoint:CGPointMake(xaxis, 37.) withFont:[UIFont fontWithName:@"Helvetica" size:22]]; 

// Line  
CGContextSetLineWidth(myContext, 2); 
CGContextSetStrokeColorWithColor(myContext, [UIColor blackColor].CGColor);  
CGContextMoveToPoint(myContext, 138, 65); 
CGContextAddLineToPoint(myContext, 318, 65); 
CGContextStrokePath(myContext); 

// Denominator part 
xaxis -= 175.0f;  
textString = @"N"; 
[textString drawAtPoint:CGPointMake(xaxis, 65.) withFont:[UIFont fontWithName:@"Helvetica-Oblique" size:20]]; 

xaxis += 18.0f; 
textString = @"2"; 
[textString drawAtPoint:CGPointMake(xaxis, 63.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

xaxis += 8.0f; 
textString = @"sin"; 
[textString drawAtPoint:CGPointMake(xaxis, 68.) withFont:[UIFont fontWithName:@"Helvetica" size:17]]; 

xaxis += 20.0f; 
textString = @"2"; 
[textString drawAtPoint:CGPointMake(xaxis, 63.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

// Inner opening bracket 
xaxis += 10.0f; 
textString = @"("; 
[textString drawAtPoint:CGPointMake(xaxis, 64.) withFont:[UIFont fontWithName:@"Helvetica" size:22]]; 

xaxis += 8.0f; 
unichar twelveChar[] = {0x03C0}; 
textString = getTextString(twelveChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 68.) withFont:[UIFont fontWithName:@"Helvetica" size:17]]; 

xaxis += 12.0f; 
unichar thirteenChar[] = {0x2206}; 
textString = getTextString(thirteenChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 65.) withFont:[UIFont fontWithName:@"Helvetica" size:21]]; 

xaxis += 15.0f; 
unichar fourteenChar[] = {0x03C9}; 
textString = getTextString(fourteenChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 67.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 15.0f; 
textString = @"k"; 
[textString drawAtPoint:CGPointMake(xaxis, 75.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

xaxis += 8.0f; 
textString = @"/"; 
[textString drawAtPoint:CGPointMake(xaxis, 64.) withFont:[UIFont fontWithName:@"Helvetica" size:24]]; 

xaxis += 8.0f; 
unichar fifteenChar[] = {0x03C9}; 
textString = getTextString(fifteenChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 67.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 15.0f; 
textString = @"res"; 
[textString drawAtPoint:CGPointMake(xaxis, 75.) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 

xaxis += 18.0f; 
textString = @"("; 
[textString drawAtPoint:CGPointMake(xaxis, 66.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

xaxis += 5.0f; 
unichar sixteenChar[] = {0x03B8}; 
textString = getTextString(sixteenChar, 1); 
[textString drawAtPoint:CGPointMake(xaxis, 66.) withFont:[UIFont fontWithName:@"Helvetica-Oblique" size:20]]; 

xaxis += 12.0f; 
textString = @")"; 
[textString drawAtPoint:CGPointMake(xaxis, 66.) withFont:[UIFont fontWithName:@"Helvetica" size:20]]; 

// Inner closing bracket 
xaxis += 6.0f; 
textString = @")"; 
[textString drawAtPoint:CGPointMake(xaxis, 64.) withFont:[UIFont fontWithName:@"Helvetica" size:22]]; 

// Extra text for information 
xaxis = 6.0f; 
textString = @"Above is the example of an equation drawn using"; 
[textString drawAtPoint:CGPointMake(xaxis, 120.) withFont:[UIFont fontWithName:@"Helvetica" size:14]]; 
xaxis = 6.0f; 
textString = @"Quartz2D"; 
[textString drawAtPoint:CGPointMake(xaxis, 140.) withFont:[UIFont fontWithName:@"Helvetica" size:14]]; 

} 

static NSString *getTextString(unichar chars[], int charLength) 
{ 
NSString *uniString = [NSString stringWithCharacters:chars length: charLength]; 
return uniString; 
} 
+0

我正在寻找其他方法在iPod/iPhone中渲染数学方程 - 并发现我们可以在UIWebView中使用MathML来显示它。那么在UIWebView中使用Quartz2D(我使用上面的过程)和MathML之间有什么区别。 – Aman 2012-01-14 14:41:59

+0

任何人 - 可以请回复。谢谢。 – Aman 2012-01-17 02:59:59

回答

0

那么区别在于,你对网页视图的控制比你在本地执行的操作要少得多。通过网络视图,您正在包装其他人提出的解决方案。如果你自己做事,你就有更多的控制权。

0

如果您正在绘制有限类别的功能,例如多项式,您可以编写一个例程,将任意多项式绘制为一系列细小的连接线段。

例如

#define STEP = .05f; 
draw_polynomial(context, MIN_X, MAX_X, polynomial) { 
    CGFloat y = polynomial.evaluateAtX(MIN_X); 
    CGContextBeginPath(context); 
    CGContextMoveToPoint(context, MIN_X, y); 
    for (CGFloat x = MIN_X + STEP; x < MAX_X; x += STEP){ 
     y = polynomial.evaluateAtX(x) 
     CGContextAddLineToPoint(context, x, y); 
    } 
    CGContextStrokePath(context); 
} 
相关问题